@reearth/core 0.0.7-alpha.64 → 0.0.7-alpha.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.umd.cjs CHANGED
@@ -6085,7 +6085,7 @@ ${this.stack.toString()}`),e},at.throwInstantiationError=function(){throw new at
6085
6085
  `;break;case"r":t+="\r";break;case"t":t+=" ";break;case"b":t+="\b";break;case"f":t+="\f";break;case"v":t+="\v";break;default:t+=o}else t+=o}return r||this.throwError('Unclosed quote after "'+t+'"'),{type:Se.LITERAL,value:t,raw:this.expr.substring(n,this.index)}}gobbleIdentifier(){let t=this.code,n=this.index;for(Se.isIdentifierStart(t)?this.index++:this.throwError("Unexpected "+this.char);this.index<this.expr.length&&(t=this.code,Se.isIdentifierPart(t));)this.index++;return{type:Se.IDENTIFIER,name:this.expr.slice(n,this.index)}}gobbleArguments(t){const n=[];let i=!1,r=0;for(;this.index<this.expr.length;){this.gobbleSpaces();let o=this.code;if(o===t){i=!0,this.index++,t===Se.CPAREN_CODE&&r&&r>=n.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}else if(o===Se.COMMA_CODE){if(this.index++,r++,r!==n.length){if(t===Se.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===Se.CBRACK_CODE)for(let s=n.length;s<r;s++)n.push(null)}}else if(n.length!==r&&r!==0)this.throwError("Expected comma");else{const s=this.gobbleExpression();(!s||s.type===Se.COMPOUND)&&this.throwError("Expected comma"),n.push(s)}}return i||this.throwError("Expected "+String.fromCharCode(t)),n}gobbleGroup(){this.index++;let t=this.gobbleExpressions(Se.CPAREN_CODE);if(this.code===Se.CPAREN_CODE)return this.index++,t.length===1?t[0]:t.length?{type:Se.SEQUENCE_EXP,expressions:t}:!1;this.throwError("Unclosed (")}gobbleArray(){return this.index++,{type:Se.ARRAY_EXP,elements:this.gobbleArguments(Se.CBRACK_CODE)}}}const m3e=new f3e;Object.assign(Se,{hooks:m3e,plugins:new p3e(Se),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),Se.max_unop_len=Se.getMaxKeyLen(Se.unary_ops),Se.max_binop_len=Se.getMaxKeyLen(Se.binary_ops);const za=e=>new Se(e).parse(),g3e=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(Se).filter(e=>!g3e.includes(e)&&za[e]===void 0).forEach(e=>{za[e]=Se[e]}),za.Jsep=Se;const y3e="ConditionalExpression";var b3e={name:"ternary",init(e){e.hooks.add("after-expression",function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const n=t.node,i=this.gobbleExpression();if(i||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const r=this.gobbleExpression();if(r||this.throwError("Expected expression"),t.node={type:y3e,test:n,consequent:i,alternate:r},n.operator&&e.binary_ops[n.operator]<=.9){let o=n;for(;o.right.operator&&e.binary_ops[o.right.operator]<=.9;)o=o.right;t.node.test=o.right,o.right=t.node,t.node=n}}else this.throwError("Expected :")}})}};za.plugins.register(b3e);const jA=47,_3e=92;var v3e={name:"regex",init(e){e.hooks.add("gobble-token",function(t){if(this.code===jA){const n=++this.index;let i=!1;for(;this.index<this.expr.length;){if(this.code===jA&&!i){const r=this.expr.slice(n,this.index);let o="";for(;++this.index<this.expr.length;){const a=this.code;if(a>=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57)o+=this.char;else break}let s;try{s=new RegExp(r,o)}catch(a){this.throwError(a.message)}return t.node={type:e.LITERAL,value:s,raw:this.expr.slice(n-1,this.index)},t.node=this.gobbleTokenProperty(t.node),t.node}this.code===e.OBRACK_CODE?i=!0:i&&this.code===e.CBRACK_CODE&&(i=!1),this.index+=this.code===_3e?2:1}this.throwError("Unclosed Regex")}})}};const CS=43,w3e=45,Xh={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[CS,w3e],assignmentPrecedence:.9,init(e){const t=[e.IDENTIFIER,e.MEMBER_EXP];Xh.assignmentOperators.forEach(i=>e.addBinaryOp(i,Xh.assignmentPrecedence,!0)),e.hooks.add("gobble-token",function(i){const r=this.code;Xh.updateOperators.some(o=>o===r&&o===this.expr.charCodeAt(this.index+1))&&(this.index+=2,i.node={type:"UpdateExpression",operator:r===CS?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!i.node.argument||!t.includes(i.node.argument.type))&&this.throwError(`Unexpected ${i.node.operator}`))}),e.hooks.add("after-token",function(i){if(i.node){const r=this.code;Xh.updateOperators.some(o=>o===r&&o===this.expr.charCodeAt(this.index+1))&&(t.includes(i.node.type)||this.throwError(`Unexpected ${i.node.operator}`),this.index+=2,i.node={type:"UpdateExpression",operator:r===CS?"++":"--",argument:i.node,prefix:!1})}}),e.hooks.add("after-expression",function(i){i.node&&n(i.node)});function n(i){Xh.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",n(i.left),n(i.right)):i.operator||Object.values(i).forEach(r=>{r&&typeof r=="object"&&n(r)})}}};za.plugins.register(v3e,Xh),za.addUnaryOp("typeof"),za.addLiteral("null",null),za.addLiteral("undefined",void 0);const x3e=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__"]),_n={evalAst(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":return _n.evalBinaryExpression(e,t);case"Compound":return _n.evalCompound(e,t);case"ConditionalExpression":return _n.evalConditionalExpression(e,t);case"Identifier":return _n.evalIdentifier(e,t);case"Literal":return _n.evalLiteral(e,t);case"MemberExpression":return _n.evalMemberExpression(e,t);case"UnaryExpression":return _n.evalUnaryExpression(e,t);case"ArrayExpression":return _n.evalArrayExpression(e,t);case"CallExpression":return _n.evalCallExpression(e,t);case"AssignmentExpression":return _n.evalAssignmentExpression(e,t);default:throw SyntaxError("Unexpected expression",e)}},evalBinaryExpression(e,t){return{"||":(n,i)=>n||i(),"&&":(n,i)=>n&&i(),"|":(n,i)=>n|i(),"^":(n,i)=>n^i(),"&":(n,i)=>n&i(),"==":(n,i)=>n==i(),"!=":(n,i)=>n!=i(),"===":(n,i)=>n===i(),"!==":(n,i)=>n!==i(),"<":(n,i)=>n<i(),">":(n,i)=>n>i(),"<=":(n,i)=>n<=i(),">=":(n,i)=>n>=i(),"<<":(n,i)=>n<<i(),">>":(n,i)=>n>>i(),">>>":(n,i)=>n>>>i(),"+":(n,i)=>n+i(),"-":(n,i)=>n-i(),"*":(n,i)=>n*i(),"/":(n,i)=>n/i(),"%":(n,i)=>n%i()}[e.operator](_n.evalAst(e.left,t),()=>_n.evalAst(e.right,t))},evalCompound(e,t){let n;for(let i=0;i<e.body.length;i++){e.body[i].type==="Identifier"&&["var","let","const"].includes(e.body[i].name)&&e.body[i+1]&&e.body[i+1].type==="AssignmentExpression"&&(i+=1);const r=e.body[i];n=_n.evalAst(r,t)}return n},evalConditionalExpression(e,t){return _n.evalAst(e.test,t)?_n.evalAst(e.consequent,t):_n.evalAst(e.alternate,t)},evalIdentifier(e,t){if(Object.hasOwn(t,e.name))return t[e.name];throw ReferenceError(`${e.name} is not defined`)},evalLiteral(e){return e.value},evalMemberExpression(e,t){const n=String(e.computed?_n.evalAst(e.property):e.property.name),i=_n.evalAst(e.object,t);if(i==null)throw TypeError(`Cannot read properties of ${i} (reading '${n}')`);if(!Object.hasOwn(i,n)&&x3e.has(n))throw TypeError(`Cannot read properties of ${i} (reading '${n}')`);const r=i[n];return typeof r=="function"?r.bind(i):r},evalUnaryExpression(e,t){return{"-":n=>-_n.evalAst(n,t),"!":n=>!_n.evalAst(n,t),"~":n=>~_n.evalAst(n,t),"+":n=>+_n.evalAst(n,t),typeof:n=>typeof _n.evalAst(n,t)}[e.operator](e.argument)},evalArrayExpression(e,t){return e.elements.map(n=>_n.evalAst(n,t))},evalCallExpression(e,t){const n=e.arguments.map(i=>_n.evalAst(i,t));return _n.evalAst(e.callee,t)(...n)},evalAssignmentExpression(e,t){if(e.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");const n=e.left.name,i=_n.evalAst(e.right,t);return t[n]=i,t[n]}};class S3e{constructor(t){this.code=t,this.ast=za(this.code)}runInNewContext(t){const n=Object.assign(Object.create(null),t);return _n.evalAst(this.ast,n)}}function kc(e,t){return e=e.slice(),e.push(t),e}function RS(e,t){return t=t.slice(),t.unshift(e),t}class E3e extends Error{constructor(t){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=t,this.name="NewError"}}function qt(e,t,n,i,r){if(!(this instanceof qt))try{return new qt(e,t,n,i,r)}catch(s){if(!s.avoidNew)throw s;return s.value}typeof e=="string"&&(r=i,i=n,n=t,t=e,e=null);const o=e&&typeof e=="object";if(e=e||{},this.json=e.json||n,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=e.flatten||!1,this.wrap=Object.hasOwn(e,"wrap")?e.wrap:!0,this.sandbox=e.sandbox||{},this.eval=e.eval===void 0?"safe":e.eval,this.ignoreEvalErrors=typeof e.ignoreEvalErrors>"u"?!1:e.ignoreEvalErrors,this.parent=e.parent||null,this.parentProperty=e.parentProperty||null,this.callback=e.callback||i||null,this.otherTypeCallback=e.otherTypeCallback||r||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},e.autostart!==!1){const s={path:o?e.path:t};o?"json"in e&&(s.json=e.json):s.json=n;const a=this.evaluate(s);if(!a||typeof a!="object")throw new E3e(a);return a}}qt.prototype.evaluate=function(e,t,n,i){let r=this.parent,o=this.parentProperty,{flatten:s,wrap:a}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,n=n||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,t=t||this.json,e=e||this.path,e&&typeof e=="object"&&!Array.isArray(e)){if(!e.path&&e.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(e,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:t}=e),s=Object.hasOwn(e,"flatten")?e.flatten:s,this.currResultType=Object.hasOwn(e,"resultType")?e.resultType:this.currResultType,this.currSandbox=Object.hasOwn(e,"sandbox")?e.sandbox:this.currSandbox,a=Object.hasOwn(e,"wrap")?e.wrap:a,this.currEval=Object.hasOwn(e,"eval")?e.eval:this.currEval,n=Object.hasOwn(e,"callback")?e.callback:n,this.currOtherTypeCallback=Object.hasOwn(e,"otherTypeCallback")?e.otherTypeCallback:this.currOtherTypeCallback,r=Object.hasOwn(e,"parent")?e.parent:r,o=Object.hasOwn(e,"parentProperty")?e.parentProperty:o,e=e.path}if(r=r||null,o=o||null,Array.isArray(e)&&(e=qt.toPathString(e)),!e&&e!==""||!t)return;const c=qt.toPathArray(e);c[0]==="$"&&c.length>1&&c.shift(),this._hasParentSelector=null;const l=this._trace(c,t,["$"],r,o,n).filter(function(u){return u&&!u.isParentSelector});return l.length?!a&&l.length===1&&!l[0].hasArrExpr?this._getPreferredOutput(l[0]):l.reduce((u,h)=>{const d=this._getPreferredOutput(h);return s&&Array.isArray(d)?u=u.concat(d):u.push(d),u},[]):a?[]:void 0},qt.prototype._getPreferredOutput=function(e){const t=this.currResultType;switch(t){case"all":{const n=Array.isArray(e.path)?e.path:qt.toPathArray(e.path);return e.pointer=qt.toPointer(n),e.path=typeof e.path=="string"?e.path:qt.toPathString(e.path),e}case"value":case"parent":case"parentProperty":return e[t];case"path":return qt.toPathString(e[t]);case"pointer":return qt.toPointer(e.path);default:throw new TypeError("Unknown result type")}},qt.prototype._handleCallback=function(e,t,n){if(t){const i=this._getPreferredOutput(e);e.path=typeof e.path=="string"?e.path:qt.toPathString(e.path),t(i,n,e)}},qt.prototype._trace=function(e,t,n,i,r,o,s,a){let c;if(!e.length)return c={path:n,value:t,parent:i,parentProperty:r,hasArrExpr:s},this._handleCallback(c,o,"value"),c;const l=e[0],u=e.slice(1),h=[];function d(f){Array.isArray(f)?f.forEach(p=>{h.push(p)}):h.push(f)}if((typeof l!="string"||a)&&t&&Object.hasOwn(t,l))d(this._trace(u,t[l],kc(n,l),t,l,o,s));else if(l==="*")this._walk(t,f=>{d(this._trace(u,t[f],kc(n,f),t,f,o,!0,!0))});else if(l==="..")d(this._trace(u,t,n,i,r,o,s)),this._walk(t,f=>{typeof t[f]=="object"&&d(this._trace(e.slice(),t[f],kc(n,f),t,f,o,!0))});else{if(l==="^")return this._hasParentSelector=!0,{path:n.slice(0,-1),expr:u,isParentSelector:!0};if(l==="~")return c={path:kc(n,l),value:r,parent:i,parentProperty:null},this._handleCallback(c,o,"property"),c;if(l==="$")d(this._trace(u,t,n,null,null,o,s));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))d(this._slice(l,u,t,n,i,r,o));else if(l.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");const f=l.replace(/^\?\((.*?)\)$/u,"$1"),p=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(f);p?this._walk(t,m=>{const y=[p[2]],g=p[1]?t[m][p[1]]:t[m];this._trace(y,g,n,i,r,o,!0).length>0&&d(this._trace(u,t[m],kc(n,m),t,m,o,!0))}):this._walk(t,m=>{this._eval(f,t[m],m,n,i,r)&&d(this._trace(u,t[m],kc(n,m),t,m,o,!0))})}else if(l[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");d(this._trace(RS(this._eval(l,t,n.at(-1),n.slice(0,-1),i,r),u),t,n,i,r,o,s))}else if(l[0]==="@"){let f=!1;const p=l.slice(1,-2);switch(p){case"scalar":(!t||!["object","function"].includes(typeof t))&&(f=!0);break;case"boolean":case"string":case"undefined":case"function":typeof t===p&&(f=!0);break;case"integer":Number.isFinite(t)&&!(t%1)&&(f=!0);break;case"number":Number.isFinite(t)&&(f=!0);break;case"nonFinite":typeof t=="number"&&!Number.isFinite(t)&&(f=!0);break;case"object":t&&typeof t===p&&(f=!0);break;case"array":Array.isArray(t)&&(f=!0);break;case"other":f=this.currOtherTypeCallback(t,n,i,r);break;case"null":t===null&&(f=!0);break;default:throw new TypeError("Unknown value type "+p)}if(f)return c={path:n,value:t,parent:i,parentProperty:r},this._handleCallback(c,o,"value"),c}else if(l[0]==="`"&&t&&Object.hasOwn(t,l.slice(1))){const f=l.slice(1);d(this._trace(u,t[f],kc(n,f),t,f,o,s,!0))}else if(l.includes(",")){const f=l.split(",");for(const p of f)d(this._trace(RS(p,u),t,n,i,r,o,!0))}else!a&&t&&Object.hasOwn(t,l)&&d(this._trace(u,t[l],kc(n,l),t,l,o,s,!0))}if(this._hasParentSelector)for(let f=0;f<h.length;f++){const p=h[f];if(p&&p.isParentSelector){const m=this._trace(p.expr,t,p.path,i,r,o,s);if(Array.isArray(m)){h[f]=m[0];const y=m.length;for(let g=1;g<y;g++)f++,h.splice(f,0,m[g])}else h[f]=m}}return h},qt.prototype._walk=function(e,t){if(Array.isArray(e)){const n=e.length;for(let i=0;i<n;i++)t(i)}else e&&typeof e=="object"&&Object.keys(e).forEach(n=>{t(n)})},qt.prototype._slice=function(e,t,n,i,r,o,s){if(!Array.isArray(n))return;const a=n.length,c=e.split(":"),l=c[2]&&Number.parseInt(c[2])||1;let u=c[0]&&Number.parseInt(c[0])||0,h=c[1]&&Number.parseInt(c[1])||a;u=u<0?Math.max(0,u+a):Math.min(a,u),h=h<0?Math.max(0,h+a):Math.min(a,h);const d=[];for(let f=u;f<h;f+=l)this._trace(RS(f,t),n,i,r,o,s,!0).forEach(p=>{d.push(p)});return d},qt.prototype._eval=function(e,t,n,i,r,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=r,this.currSandbox._$_property=n,this.currSandbox._$_root=this.json,this.currSandbox._$_v=t;const s=e.includes("@path");s&&(this.currSandbox._$_path=qt.toPathString(i.concat([n])));const a=this.currEval+"Script:"+e;if(!qt.cache[a]){let c=e.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(s&&(c=c.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)qt.cache[a]=new this.safeVm.Script(c);else if(this.currEval==="native")qt.cache[a]=new this.vm.Script(c);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){const l=this.currEval;qt.cache[a]=new l(c)}else if(typeof this.currEval=="function")qt.cache[a]={runInNewContext:l=>this.currEval(c,l)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return qt.cache[a].runInNewContext(this.currSandbox)}catch(c){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+c.message+": "+e)}},qt.cache={},qt.toPathString=function(e){const t=e,n=t.length;let i="$";for(let r=1;r<n;r++)/^(~|\^|@.*?\(\))$/u.test(t[r])||(i+=/^[0-9*]+$/u.test(t[r])?"["+t[r]+"]":"['"+t[r]+"']");return i},qt.toPointer=function(e){const t=e,n=t.length;let i="";for(let r=1;r<n;r++)/^(~|\^|@.*?\(\))$/u.test(t[r])||(i+="/"+t[r].toString().replaceAll("~","~0").replaceAll("/","~1"));return i},qt.toPathArray=function(e){const{cache:t}=qt;if(t[e])return t[e].concat();const n=[],i=e.replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/gu,";$&;").replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu,function(r,o){return"[#"+(n.push(o)-1)+"]"}).replaceAll(/\[['"]([^'\]]*)['"]\]/gu,function(r,o){return"['"+o.replaceAll(".","%@%").replaceAll("~","%%@@%%")+"']"}).replaceAll("~",";~;").replaceAll(/['"]?\.['"]?(?![^[]*\])|\[['"]?/gu,";").replaceAll("%@%",".").replaceAll("%%@@%%","~").replaceAll(/(?:;)?(\^+)(?:;)?/gu,function(r,o){return";"+o.split("").join(";")+";"}).replaceAll(/;;;|;;/gu,";..;").replaceAll(/;$|'?\]|'$/gu,"").split(";").map(function(r){const o=r.match(/#(\d+)/u);return!o||!o[1]?r:n[o[1]]});return t[e]=i,t[e].concat()},qt.prototype.safeVm={Script:S3e};const T3e=function(e,t,n){const i=e.length;for(let r=0;r<i;r++){const o=e[r];n(o)&&t.push(e.splice(r--,1)[0])}};class C3e{constructor(t){this.code=t}runInNewContext(t){let n=this.code;const i=Object.keys(t),r=[];T3e(i,r,c=>typeof t[c]=="function");const o=i.map(c=>t[c]);n=r.reduce((c,l)=>{let u=t[l].toString();return/function/u.test(u)||(u="function "+u),"var "+l+"="+u+";"+c},"")+n,!/(['"])use strict\1/u.test(n)&&!i.includes("arguments")&&(n="var arguments = undefined;"+n),n=n.replace(/;\s*$/u,"");const s=n.lastIndexOf(";"),a=s!==-1?n.slice(0,s+1)+" return "+n.slice(s+1):" return "+n;return new Function(...i,a)(...o)}}qt.prototype.vm={Script:C3e};const R3e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",I3e=e=>Array.from(window.crypto.getRandomValues(new Uint8Array(e))).map(t=>R3e[t%e]).join("").toLowerCase(),KA=e=>{if(typeof e!="object"||e===null)return e;for(const t in e)if(typeof e[t]=="string")try{e[t].startsWith("{")&&e[t].endsWith("}")&&(e[t]=JSON.parse(e[t]))}catch{console.error("Invalid JSON:",e[t])}else typeof e[t]=="object"&&(e[t]=KA(e[t]));return e},IS="czm_";function M3e(e,t){let n=e,i="";const r=[];let o=n.indexOf("${");const s=typeof t<"u",a={},c=/^\$./;for(;o>=0;)if(L3e(n,o)){const l=P3e(n,o);i+=n.slice(0,l+1),n=n.slice(l+1),o=n.indexOf("${")}else{i+=n.slice(0,o);const l=O3e(n,o),u=n.slice(o+2,l);if(c.test(u)){if(!s)return[i,[]];let h=a[u];if(!h)try{h=qt({json:t,path:u}),a[u]=h}catch{return[i,[]]}if(h.length!==0){const d=I3e(10);r.push({literalName:d,literalValue:h[0]}),i+=d}else return["false",[]]}else{const h=G3e(u);i+=`${IS}${h}`}n=n.slice(l+1),o=n.indexOf("${")}return i+=n,[i,r]}function L3e(e,t){const n=e.indexOf("'"),i=e.indexOf('"');return n>=0&&n<t?e.indexOf("'",n+1)>=t:i>=0&&i<t?e.indexOf('"',i+1)>=t:!1}function P3e(e,t){const n=e.indexOf("'"),i=e.indexOf('"');return n>=0&&n<t?e.indexOf("'",n+1):i>=0&&i<t?e.indexOf('"',i+1):-1}function O3e(e,t){const n=e.indexOf("}",t);if(n<0)throw new Error("replaceVariable: Unmatched {.");return n}const Dl=e=>`$reearth_${e}_$`,MS={"[":Dl("opened_square_bracket"),"]":Dl("closed_square_bracket"),"{":Dl("opened_curly_bracket"),"}":Dl("closed_curly_bracket"),"(":Dl("opened_parentheses"),")":Dl("closed_parentheses"),"-":Dl("hyphen")},G3e=e=>{const t=e.replace(/-/g,MS["-"]);return/(\]|\)|\})[^[.]+$/.test(t)?Object.entries(MS).reduce((n,[i,r])=>n.replaceAll(i,r),t):t},V3e=e=>Object.entries(MS).reduce((t,[n,i])=>t.replaceAll(i,n),e),F3e=new Set(JRe),JA=new Set(QRe);function sn(e,t){let n=new Error("failed to parse");const i=t.type;if(i==="Literal")n=A3e(t);else if(i==="CallExpression")n=N3e(e,t);else if(i==="Identifier")n=k3e(t);else if(i==="UnaryExpression"){const r=t.operator,o=sn(e,t.argument);if(F3e.has(r))n=new Lt(bt.UNARY,r,o);else throw new Error(`Unexpected operator "${r}".`)}else if(i==="BinaryExpression"){const r=t.operator,o=sn(e,t.left),s=sn(e,t.right);if(JA.has(r))n=new Lt(bt.BINARY,r,o,s);else throw new Error(`Unexpected operator "${r}".`)}else if(i==="LogicalExpression"){const r=t.operator,o=sn(e,t.left),s=sn(e,t.right);JA.has(r)&&(n=new Lt(bt.BINARY,r,o,s))}else if(i==="ConditionalExpression"){const r=sn(e,t.test),o=sn(e,t.consequent),s=sn(e,t.alternate);n=new Lt(bt.CONDITIONAL,"?",o,s,r)}else if(i==="MemberExpression")n=D3e(e,t);else if(i==="ArrayExpression"){const r=[];for(let o=0;o<t.elements.length;o++)r[o]=sn(e,t.elements[o]);n=new Lt(bt.ARRAY,r)}else throw i==="Compound"?new Error("Provide exactly one expression."):new Error("Cannot parse expression.");return n}function A3e(e){const t=typeof e.value;if(e.value===null)return new Lt(bt.LITERAL_NULL,null);if(t==="boolean")return new Lt(bt.LITERAL_BOOLEAN,e.value);if(t==="number")return new Lt(bt.LITERAL_NUMBER,e.value);if(t==="string")return e.value.indexOf("${")>=0?new Lt(bt.VARIABLE_IN_STRING,e.value):new Lt(bt.LITERAL_STRING,z3e(e.value));throw new Error(`${e} is not a function.`)}function z3e(e){return e.replace(e3e,"\\")}function N3e(e,t){const n=t.arguments,i=n.length;if(t.callee.type==="MemberExpression"){const o=t.callee.property.name,s=t.callee.object;if(o==="test"||o==="exec"){if(s.callee.name!=="regExp")throw new Error(`${o} is not a function.`);if(i===0)return o==="test"?new Lt(bt.LITERAL_BOOLEAN,!1):new Lt(bt.LITERAL_NULL,null);const a=sn(e,s),c=sn(e,n[0]);return new Lt(bt.FUNCTION_CALL,o,a,c)}else if(o==="toString"){const a=sn(e,s);return new Lt(bt.FUNCTION_CALL,o,a)}throw new Error(`Unexpected function call "${o}".`)}const r=t.callee.name;if(r==="color"){if(i===0)return new Lt(bt.LITERAL_COLOR,r);const o=sn(e,n[0]);if(typeof n[1]<"u"){const s=sn(e,n[1]);return new Lt(bt.LITERAL_COLOR,r,[o,s])}return new Lt(bt.LITERAL_COLOR,r,[o])}else if(r==="rgb"||r==="hsl"){if(i<3)throw new Error(`${r} requires three arguments.`);const o=[sn(e,n[0]),sn(e,n[1]),sn(e,n[2])];return new Lt(bt.LITERAL_COLOR,r,o)}else if(r==="rgba"||r==="hsla"){if(i<4)throw new Error(`${r} requires four arguments.`);const o=[sn(e,n[0]),sn(e,n[1]),sn(e,n[2]),sn(e,n[3])];return new Lt(bt.LITERAL_COLOR,r,o)}else if(r==="isNaN"||r==="isFinite"){if(i===0)return r==="isNaN"?new Lt(bt.LITERAL_BOOLEAN,!0):new Lt(bt.LITERAL_BOOLEAN,!1);const o=sn(e,n[0]);return new Lt(bt.UNARY,r,o)}else if(typeof ES[r]<"u"){if(i!==1)throw new Error(`${r} requires exactly one argument.`);const o=sn(e,n[0]);return new Lt(bt.UNARY,r,o)}else if(typeof SS[r]<"u"){if(i!==2)throw new Error(`${r} requires exactly two arguments.`);const o=sn(e,n[0]),s=sn(e,n[1]);return new Lt(bt.BINARY,r,o,s)}else if(r==="Boolean"){if(i===0)return new Lt(bt.LITERAL_BOOLEAN,!1);const o=sn(e,n[0]);return new Lt(bt.UNARY,r,o)}else if(r==="Number"){if(i===0)return new Lt(bt.LITERAL_NUMBER,0);const o=sn(e,n[0]);return new Lt(bt.UNARY,r,o)}else if(r==="String"){if(i===0)return new Lt(bt.LITERAL_STRING,"");const o=sn(e,n[0]);return new Lt(bt.UNARY,r,o)}throw new Error(`Unexpected function call "${r}".`)}function k3e(e){const t=e.name;if(U3e(t)){const n=W3e(t);return n.substring(0,8)==="tiles3d_"?new Lt(bt.BUILTIN_VARIABLE,n):new Lt(bt.VARIABLE,n)}else{if(t==="NaN")return new Lt(bt.LITERAL_NUMBER,NaN);if(t==="Infinity")return new Lt(bt.LITERAL_NUMBER,1/0);if(t==="undefined")return new Lt(bt.LITERAL_UNDEFINED,void 0)}throw new Error(`${t} is not defined.`)}function X3e(e){const t=e.property.name;if(t==="PI")return new Lt(bt.LITERAL_NUMBER,Math.PI);if(t==="E")return new Lt(bt.LITERAL_NUMBER,Math.E);throw new Error(`${t} Math Constant is not supported at the moment`)}function Z3e(e){const t=e.property.name;if(t==="POSITIVE_INFINITY")return new Lt(bt.LITERAL_NUMBER,Number.POSITIVE_INFINITY);throw new Error(`${t} Number Constant is not supported at the moment`)}function D3e(e,t){if(t.object.name==="Math")return X3e(t);if(t.object.name==="Number")return Z3e(t);let n;const i=sn(e,t.object);return t.computed?(n=sn(e,t.property),new Lt(bt.MEMBER,"brackets",i,n)):(n=new Lt(bt.LITERAL_STRING,t.property.name),new Lt(bt.MEMBER,"dot",i,n))}function U3e(e){return e.substring(0,4)===IS}function W3e(e){return V3e(e).substring(4)}const QA=new Map,qA=new Map,$A=new Map,ez=new Map;class sb{constructor(t,n,i){st(this,"_runtimeAst"),st(this,"_feature");var r;this._feature=n;let o=[];t=B3e(t,i);const s=qA.get(t);if(s)[t,o]=s;else{const c=t;[t,o]=M3e(Y3e(t),(r=this._feature)==null?void 0:r.properties),t.includes(IS)&&qA.set(c,[t,o])}const a=QA.get(t);if(a)this._runtimeAst=a;else{if(o.length!==0)for(const l of o)Nc.addLiteral(l.literalName,l.literalValue);Nc.addBinaryOp("=~",0),Nc.addBinaryOp("!~",0);let c;try{c=Nc(t)}catch(l){throw new Error(`failed to generate ast: ${l}`)}this._runtimeAst=sn(this,c),QA.set(t,this._runtimeAst)}}evaluate(){return this._runtimeAst.evaluate(this._feature)}}function B3e(e,t){if(typeof t>"u")return e;const n=JSON.stringify(Object.entries(t).sort()),i=e+n,r=ez.get(i);if(r)return r;let o=$A.get(e);o||(o=new RegExp(`\\$\\{(${Object.keys(t).join("|")})\\}`,"g"),$A.set(e,o));const s=e.replace(o,(a,c)=>typeof t[c]<"u"?`(${t[c]})`:"");return ez.set(i,s),s}function Y3e(e){return e.replace(qRe,$Re)}class H3e{constructor(t,n,i){st(this,"_conditions"),st(this,"_runtimeConditions"),st(this,"_feature"),st(this,"_memoizedResult"),this._conditions=t.conditions,this._runtimeConditions=[],this._feature=n,this._memoizedResult=void 0,this.setRuntime(i)}setRuntime(t){var n;const i=(n=this._conditions)==null?void 0:n.map(r=>{const o=String(r[0]),s=String(r[1]);return new j3e(new sb(o,this._feature,t),new sb(s,this._feature,t))});this._runtimeConditions=i??[],this._memoizedResult=void 0}evaluate(){if(typeof this._memoizedResult<"u")return this._memoizedResult;const t=this._runtimeConditions,n=t.length;for(let r=0;r<n;r++){const o=t[r];if(o.condition.evaluate()){const s=o.expression.evaluate();return this._memoizedResult=s,s}}const i=void 0;return this._memoizedResult=i,i}}class j3e{constructor(t,n){st(this,"condition"),st(this,"expression"),this.condition=t,this.expression=n}}const K3e=(e,t,n)=>{const i=VCe(e,URe),r=eIe(e,t);return{...r,...J3e(i,e,r),type:"computedFeature",interval:n}};function J3e(e,t,n){if(!n){if(!t.id)throw new Error("layer id is required");n={type:"feature",id:t.id,properties:t.properties||{}}}return Object.fromEntries(Object.entries(e).map(([i,r])=>r?[i,tz(r,t,n)]:void 0).filter(i=>!!i))}function tz(e,t,n){return Object.fromEntries(Object.entries(e).map(([i,r])=>q3e(r)?[i,tz(r,t,n)]:[i,$3e(r,t,n)]))}function Q3e(e){return typeof e=="object"&&e&&"expression"in e}function q3e(e){return typeof e=="object"&&e&&!("expression"in e)&&!Array.isArray(e)}function $3e(e,t,n){try{if(Q3e(e)){const i=e.expression,r=KA(KTe(n));return typeof i>"u"?void 0:typeof i=="object"&&i.conditions?new H3e(i,r,t.defines).evaluate():typeof i=="boolean"||typeof i=="number"?new sb(String(i),r,t.defines).evaluate():typeof i=="string"?new sb(i,r,t.defines).evaluate():i}return e}catch(i){console.error(i);return}}function eIe(e,t){var n;const i=(n=e.data)==null?void 0:n.jsonProperties;if(!t.properties||!i||!i.length)return t;const r={...t,...t!=null&&t.properties?{properties:{...t.properties}}:{}};return i.forEach(o=>{r.properties[o]=(()=>{const s=r.properties[o];try{return JSON.parse(s)}catch{return s}})()}),r}function LS(e,t){if(e.type==="simple")return K3e(e,t)}const tIe=(e,t,n)=>{if(!n)return;const i=(()=>{switch(Fa.types[e.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})();if(!i)return;const r=e.id?String(e.id):nIe(e.loadGeometry(),t),o=LS(n,iIe(r,e,t,i)),s=new M.ImageryLayerFeatureInfo;return s.data={layerId:n?.id,featureId:r,feature:o,appearanceType:Fa.types[e.type].toLowerCase()},s},nIe=(e,t)=>{const n=[t.x,t.y,t.level,...e.flatMap(i=>i.map(r=>[r.x,r.y]))].join(":");return ZRe(n)},iIe=(e,t,n,i)=>{const r=t.loadGeometry(),[o,s]=(()=>{if(i==="polygon")return["Polygon",r.map(a=>a.map(c=>[c.x,c.y]))];if(i==="polyline")return["LineString",r[0].map(a=>[a.x,a.y])];if(i==="marker")return["Point",[r[0][0].x,r[0][0].y]];throw new Error(`Unexpected appearance ${i}`)})();return{type:"feature",id:e,geometry:{type:o,coordinates:s},properties:t.properties,range:{x:n.x,y:n.y,z:n.level}}},Zh=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,nz=new Set,PS=typeof process=="object"&&process?process:{},iz=(e,t,n,i)=>{typeof PS.emitWarning=="function"?PS.emitWarning(e,t,n,i):console.error(`[${n}] ${t}: ${e}`)};let ab=globalThis.AbortController,rz=globalThis.AbortSignal;var oz;if(typeof ab>"u"){rz=class{constructor(){st(this,"onabort"),st(this,"_onabort",[]),st(this,"reason"),st(this,"aborted",!1)}addEventListener(n,i){this._onabort.push(i)}},ab=class{constructor(){st(this,"signal",new rz),t()}abort(n){var i,r;if(!this.signal.aborted){this.signal.reason=n,this.signal.aborted=!0;for(const o of this.signal._onabort)o(n);(r=(i=this.signal).onabort)==null||r.call(i,n)}}};let e=((oz=PS.env)==null?void 0:oz.LRU_CACHE_IGNORE_AC_WARNING)!=="1";const t=()=>{e&&(e=!1,iz("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}const rIe=e=>!nz.has(e),Xc=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),sz=e=>Xc(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?cb:null:null;class cb extends Array{constructor(t){super(t),this.fill(0)}}var jp;const Kp=class{constructor(e,t){if(st(this,"heap"),st(this,"length"),!re(Kp,jp))throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}static create(e){const t=sz(e);if(!t)return[];wt(Kp,jp,!0);const n=new Kp(e,t);return wt(Kp,jp,!1),n}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}};let az=Kp;jp=new WeakMap,Ot(az,jp,!1);var js,Ro,Ks,Js,Jp,Ci,Io,yi,Nn,Ct,Xr,Mo,pr,Fi,Qs,Ai,qs,$s,Lo,ea,Ul,Zr,lb,OS,Dh,Zc,ub,Po,GS,cz,Uh,Qp,hb,Na,Dc,ka,Uc,db,VS,lz,qp,fb,$p,pb,En,On,mb,FS,Wh,e0;const uz=class{constructor(e){Ot(this,lb),Ot(this,GS),Ot(this,Na),Ot(this,ka),Ot(this,db),Ot(this,qp),Ot(this,$p),Ot(this,En),Ot(this,mb),Ot(this,Wh),Ot(this,js,void 0),Ot(this,Ro,void 0),Ot(this,Ks,void 0),Ot(this,Js,void 0),Ot(this,Jp,void 0),st(this,"ttl"),st(this,"ttlResolution"),st(this,"ttlAutopurge"),st(this,"updateAgeOnGet"),st(this,"updateAgeOnHas"),st(this,"allowStale"),st(this,"noDisposeOnSet"),st(this,"noUpdateTTL"),st(this,"maxEntrySize"),st(this,"sizeCalculation"),st(this,"noDeleteOnFetchRejection"),st(this,"noDeleteOnStaleGet"),st(this,"allowStaleOnFetchAbort"),st(this,"allowStaleOnFetchRejection"),st(this,"ignoreFetchAbort"),Ot(this,Ci,void 0),Ot(this,Io,void 0),Ot(this,yi,void 0),Ot(this,Nn,void 0),Ot(this,Ct,void 0),Ot(this,Xr,void 0),Ot(this,Mo,void 0),Ot(this,pr,void 0),Ot(this,Fi,void 0),Ot(this,Qs,void 0),Ot(this,Ai,void 0),Ot(this,qs,void 0),Ot(this,$s,void 0),Ot(this,Lo,void 0),Ot(this,ea,void 0),Ot(this,Ul,void 0),Ot(this,Zr,void 0),Ot(this,Dh,()=>{}),Ot(this,Zc,()=>{}),Ot(this,ub,()=>{}),Ot(this,Po,()=>!1),Ot(this,Uh,O=>{}),Ot(this,Qp,(O,V,A)=>{}),Ot(this,hb,(O,V,A,G)=>{if(A||G)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0}),st(this,lz,"LRUCache");const{max:t=0,ttl:n,ttlResolution:i=1,ttlAutopurge:r,updateAgeOnGet:o,updateAgeOnHas:s,allowStale:a,dispose:c,disposeAfter:l,noDisposeOnSet:u,noUpdateTTL:h,maxSize:d=0,maxEntrySize:f=0,sizeCalculation:p,fetchMethod:m,noDeleteOnFetchRejection:y,noDeleteOnStaleGet:g,allowStaleOnFetchRejection:v,allowStaleOnFetchAbort:S,ignoreFetchAbort:T}=e;if(t!==0&&!Xc(t))throw new TypeError("max option must be a nonnegative integer");const C=t?sz(t):Array;if(!C)throw new Error("invalid max value: "+t);if(wt(this,js,t),wt(this,Ro,d),this.maxEntrySize=f||re(this,Ro),this.sizeCalculation=p,this.sizeCalculation){if(!re(this,Ro)&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(m!==void 0&&typeof m!="function")throw new TypeError("fetchMethod must be a function if specified");if(wt(this,Jp,m),wt(this,Ul,!!m),wt(this,yi,new Map),wt(this,Nn,new Array(t).fill(void 0)),wt(this,Ct,new Array(t).fill(void 0)),wt(this,Xr,new C(t)),wt(this,Mo,new C(t)),wt(this,pr,0),wt(this,Fi,0),wt(this,Qs,az.create(t)),wt(this,Ci,0),wt(this,Io,0),typeof c=="function"&&wt(this,Ks,c),typeof l=="function"?(wt(this,Js,l),wt(this,Ai,[])):(wt(this,Js,void 0),wt(this,Ai,void 0)),wt(this,ea,!!re(this,Ks)),wt(this,Zr,!!re(this,Js)),this.noDisposeOnSet=!!u,this.noUpdateTTL=!!h,this.noDeleteOnFetchRejection=!!y,this.allowStaleOnFetchRejection=!!v,this.allowStaleOnFetchAbort=!!S,this.ignoreFetchAbort=!!T,this.maxEntrySize!==0){if(re(this,Ro)!==0&&!Xc(re(this,Ro)))throw new TypeError("maxSize must be a positive integer if specified");if(!Xc(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");ft(this,GS,cz).call(this)}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!g,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!s,this.ttlResolution=Xc(i)||i===0?i:1,this.ttlAutopurge=!!r,this.ttl=n||0,this.ttl){if(!Xc(this.ttl))throw new TypeError("ttl must be a positive integer if specified");ft(this,lb,OS).call(this)}if(re(this,js)===0&&this.ttl===0&&re(this,Ro)===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!re(this,js)&&!re(this,Ro)){const O="LRU_CACHE_UNBOUNDED";rIe(O)&&(nz.add(O),iz("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",O,uz))}}static unsafeExposeInternals(e){return{starts:re(e,$s),ttls:re(e,Lo),sizes:re(e,qs),keyMap:re(e,yi),keyList:re(e,Nn),valList:re(e,Ct),next:re(e,Xr),prev:re(e,Mo),get head(){return re(e,pr)},get tail(){return re(e,Fi)},free:re(e,Qs),isBackgroundFetch:t=>{var n;return ft(n=e,En,On).call(n,t)},backgroundFetch:(t,n,i,r)=>{var o;return ft(o=e,$p,pb).call(o,t,n,i,r)},moveToTail:t=>{var n;return ft(n=e,Wh,e0).call(n,t)},indexes:t=>{var n;return ft(n=e,Na,Dc).call(n,t)},rindexes:t=>{var n;return ft(n=e,ka,Uc).call(n,t)},isStale:t=>{var n;return re(n=e,Po).call(n,t)}}}get max(){return re(this,js)}get maxSize(){return re(this,Ro)}get calculatedSize(){return re(this,Io)}get size(){return re(this,Ci)}get fetchMethod(){return re(this,Jp)}get dispose(){return re(this,Ks)}get disposeAfter(){return re(this,Js)}getRemainingTTL(e){return re(this,yi).has(e)?1/0:0}*entries(){for(const e of ft(this,Na,Dc).call(this))re(this,Ct)[e]!==void 0&&re(this,Nn)[e]!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield[re(this,Nn)[e],re(this,Ct)[e]])}*rentries(){for(const e of ft(this,ka,Uc).call(this))re(this,Ct)[e]!==void 0&&re(this,Nn)[e]!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield[re(this,Nn)[e],re(this,Ct)[e]])}*keys(){for(const e of ft(this,Na,Dc).call(this)){const t=re(this,Nn)[e];t!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield t)}}*rkeys(){for(const e of ft(this,ka,Uc).call(this)){const t=re(this,Nn)[e];t!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield t)}}*values(){for(const e of ft(this,Na,Dc).call(this))re(this,Ct)[e]!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield re(this,Ct)[e])}*rvalues(){for(const e of ft(this,ka,Uc).call(this))re(this,Ct)[e]!==void 0&&!ft(this,En,On).call(this,re(this,Ct)[e])&&(yield re(this,Ct)[e])}[Symbol.iterator](){return this.entries()}find(e,t={}){for(const n of ft(this,Na,Dc).call(this)){const i=re(this,Ct)[n],r=ft(this,En,On).call(this,i)?i.__staleWhileFetching:i;if(r!==void 0&&e(r,re(this,Nn)[n],this))return this.get(re(this,Nn)[n],t)}}forEach(e,t=this){for(const n of ft(this,Na,Dc).call(this)){const i=re(this,Ct)[n],r=ft(this,En,On).call(this,i)?i.__staleWhileFetching:i;r!==void 0&&e.call(t,r,re(this,Nn)[n],this)}}rforEach(e,t=this){for(const n of ft(this,ka,Uc).call(this)){const i=re(this,Ct)[n],r=ft(this,En,On).call(this,i)?i.__staleWhileFetching:i;r!==void 0&&e.call(t,r,re(this,Nn)[n],this)}}purgeStale(){let e=!1;for(const t of ft(this,ka,Uc).call(this,{allowStale:!0}))re(this,Po).call(this,t)&&(this.delete(re(this,Nn)[t]),e=!0);return e}info(e){const t=re(this,yi).get(e);if(t===void 0)return;const n=re(this,Ct)[t],i=ft(this,En,On).call(this,n)?n.__staleWhileFetching:n;if(i===void 0)return;const r={value:i};if(re(this,Lo)&&re(this,$s)){const o=re(this,Lo)[t],s=re(this,$s)[t];if(o&&s){const a=o-(Zh.now()-s);r.ttl=a,r.start=Date.now()}}return re(this,qs)&&(r.size=re(this,qs)[t]),r}dump(){const e=[];for(const t of ft(this,Na,Dc).call(this,{allowStale:!0})){const n=re(this,Nn)[t],i=re(this,Ct)[t],r=ft(this,En,On).call(this,i)?i.__staleWhileFetching:i;if(r===void 0||n===void 0)continue;const o={value:r};if(re(this,Lo)&&re(this,$s)){o.ttl=re(this,Lo)[t];const s=Zh.now()-re(this,$s)[t];o.start=Math.floor(Date.now()-s)}re(this,qs)&&(o.size=re(this,qs)[t]),e.unshift([n,o])}return e}load(e){this.clear();for(const[t,n]of e){if(n.start){const i=Date.now()-n.start;n.start=Zh.now()-i}this.set(t,n.value,n)}}set(e,t,n={}){var i,r,o,s,a;if(t===void 0)return this.delete(e),this;const{ttl:c=this.ttl,start:l,noDisposeOnSet:u=this.noDisposeOnSet,sizeCalculation:h=this.sizeCalculation,status:d}=n;let{noUpdateTTL:f=this.noUpdateTTL}=n;const p=re(this,hb).call(this,e,t,n.size||0,h);if(this.maxEntrySize&&p>this.maxEntrySize)return d&&(d.set="miss",d.maxEntrySizeExceeded=!0),this.delete(e),this;let m=re(this,Ci)===0?void 0:re(this,yi).get(e);if(m===void 0)m=re(this,Ci)===0?re(this,Fi):re(this,Qs).length!==0?re(this,Qs).pop():re(this,Ci)===re(this,js)?ft(this,qp,fb).call(this,!1):re(this,Ci),re(this,Nn)[m]=e,re(this,Ct)[m]=t,re(this,yi).set(e,m),re(this,Xr)[re(this,Fi)]=m,re(this,Mo)[m]=re(this,Fi),wt(this,Fi,m),nS(this,Ci)._++,re(this,Qp).call(this,m,p,d),d&&(d.set="add"),f=!1;else{ft(this,Wh,e0).call(this,m);const y=re(this,Ct)[m];if(t!==y){if(re(this,Ul)&&ft(this,En,On).call(this,y)){y.__abortController.abort(new Error("replaced"));const{__staleWhileFetching:g}=y;g!==void 0&&!u&&(re(this,ea)&&((i=re(this,Ks))==null||i.call(this,g,e,"set")),re(this,Zr)&&((r=re(this,Ai))==null||r.push([g,e,"set"])))}else u||(re(this,ea)&&((o=re(this,Ks))==null||o.call(this,y,e,"set")),re(this,Zr)&&((s=re(this,Ai))==null||s.push([y,e,"set"])));if(re(this,Uh).call(this,m),re(this,Qp).call(this,m,p,d),re(this,Ct)[m]=t,d){d.set="replace";const g=y&&ft(this,En,On).call(this,y)?y.__staleWhileFetching:y;g!==void 0&&(d.oldValue=g)}}else d&&(d.set="update")}if(c!==0&&!re(this,Lo)&&ft(this,lb,OS).call(this),re(this,Lo)&&(f||re(this,ub).call(this,m,c,l),d&&re(this,Zc).call(this,d,m)),!u&&re(this,Zr)&&re(this,Ai)){const y=re(this,Ai);let g;for(;g=y?.shift();)(a=re(this,Js))==null||a.call(this,...g)}return this}pop(){var e;try{for(;re(this,Ci);){const t=re(this,Ct)[re(this,pr)];if(ft(this,qp,fb).call(this,!0),ft(this,En,On).call(this,t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(re(this,Zr)&&re(this,Ai)){const t=re(this,Ai);let n;for(;n=t?.shift();)(e=re(this,Js))==null||e.call(this,...n)}}}has(e,t={}){const{updateAgeOnHas:n=this.updateAgeOnHas,status:i}=t,r=re(this,yi).get(e);if(r!==void 0){const o=re(this,Ct)[r];if(ft(this,En,On).call(this,o)&&o.__staleWhileFetching===void 0)return!1;if(re(this,Po).call(this,r))i&&(i.has="stale",re(this,Zc).call(this,i,r));else return n&&re(this,Dh).call(this,r),i&&(i.has="hit",re(this,Zc).call(this,i,r)),!0}else i&&(i.has="miss");return!1}peek(e,t={}){const{allowStale:n=this.allowStale}=t,i=re(this,yi).get(e);if(i===void 0||!n&&re(this,Po).call(this,i))return;const r=re(this,Ct)[i];return ft(this,En,On).call(this,r)?r.__staleWhileFetching:r}async fetch(e,t={}){const{allowStale:n=this.allowStale,updateAgeOnGet:i=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:s=this.noDisposeOnSet,size:a=0,sizeCalculation:c=this.sizeCalculation,noUpdateTTL:l=this.noUpdateTTL,noDeleteOnFetchRejection:u=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:h=this.allowStaleOnFetchRejection,ignoreFetchAbort:d=this.ignoreFetchAbort,allowStaleOnFetchAbort:f=this.allowStaleOnFetchAbort,context:p,forceRefresh:m=!1,status:y,signal:g}=t;if(!re(this,Ul))return y&&(y.fetch="get"),this.get(e,{allowStale:n,updateAgeOnGet:i,noDeleteOnStaleGet:r,status:y});const v={allowStale:n,updateAgeOnGet:i,noDeleteOnStaleGet:r,ttl:o,noDisposeOnSet:s,size:a,sizeCalculation:c,noUpdateTTL:l,noDeleteOnFetchRejection:u,allowStaleOnFetchRejection:h,allowStaleOnFetchAbort:f,ignoreFetchAbort:d,status:y,signal:g};let S=re(this,yi).get(e);if(S===void 0){y&&(y.fetch="miss");const T=ft(this,$p,pb).call(this,e,S,v,p);return T.__returned=T}else{const T=re(this,Ct)[S];if(ft(this,En,On).call(this,T)){const A=n&&T.__staleWhileFetching!==void 0;return y&&(y.fetch="inflight",A&&(y.returnedStale=!0)),A?T.__staleWhileFetching:T.__returned=T}const C=re(this,Po).call(this,S);if(!m&&!C)return y&&(y.fetch="hit"),ft(this,Wh,e0).call(this,S),i&&re(this,Dh).call(this,S),y&&re(this,Zc).call(this,y,S),T;const O=ft(this,$p,pb).call(this,e,S,v,p),V=O.__staleWhileFetching!==void 0&&n;return y&&(y.fetch=C?"stale":"refresh",V&&C&&(y.returnedStale=!0)),V?O.__staleWhileFetching:O.__returned=O}}get(e,t={}){const{allowStale:n=this.allowStale,updateAgeOnGet:i=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,status:o}=t,s=re(this,yi).get(e);if(s!==void 0){const a=re(this,Ct)[s],c=ft(this,En,On).call(this,a);return o&&re(this,Zc).call(this,o,s),re(this,Po).call(this,s)?(o&&(o.get="stale"),c?(o&&n&&a.__staleWhileFetching!==void 0&&(o.returnedStale=!0),n?a.__staleWhileFetching:void 0):(r||this.delete(e),o&&n&&(o.returnedStale=!0),n?a:void 0)):(o&&(o.get="hit"),c?a.__staleWhileFetching:(ft(this,Wh,e0).call(this,s),i&&re(this,Dh).call(this,s),a))}else o&&(o.get="miss")}delete(e){var t,n,i,r;let o=!1;if(re(this,Ci)!==0){const s=re(this,yi).get(e);if(s!==void 0)if(o=!0,re(this,Ci)===1)this.clear();else{re(this,Uh).call(this,s);const a=re(this,Ct)[s];if(ft(this,En,On).call(this,a)?a.__abortController.abort(new Error("deleted")):(re(this,ea)||re(this,Zr))&&(re(this,ea)&&((t=re(this,Ks))==null||t.call(this,a,e,"delete")),re(this,Zr)&&((n=re(this,Ai))==null||n.push([a,e,"delete"]))),re(this,yi).delete(e),re(this,Nn)[s]=void 0,re(this,Ct)[s]=void 0,s===re(this,Fi))wt(this,Fi,re(this,Mo)[s]);else if(s===re(this,pr))wt(this,pr,re(this,Xr)[s]);else{const c=re(this,Mo)[s];re(this,Xr)[c]=re(this,Xr)[s];const l=re(this,Xr)[s];re(this,Mo)[l]=re(this,Mo)[s]}nS(this,Ci)._--,re(this,Qs).push(s)}}if(re(this,Zr)&&(i=re(this,Ai))!=null&&i.length){const s=re(this,Ai);let a;for(;a=s?.shift();)(r=re(this,Js))==null||r.call(this,...a)}return o}clear(){var e,t,n;for(const i of ft(this,ka,Uc).call(this,{allowStale:!0})){const r=re(this,Ct)[i];if(ft(this,En,On).call(this,r))r.__abortController.abort(new Error("deleted"));else{const o=re(this,Nn)[i];re(this,ea)&&((e=re(this,Ks))==null||e.call(this,r,o,"delete")),re(this,Zr)&&((t=re(this,Ai))==null||t.push([r,o,"delete"]))}}if(re(this,yi).clear(),re(this,Ct).fill(void 0),re(this,Nn).fill(void 0),re(this,Lo)&&re(this,$s)&&(re(this,Lo).fill(0),re(this,$s).fill(0)),re(this,qs)&&re(this,qs).fill(0),wt(this,pr,0),wt(this,Fi,0),re(this,Qs).length=0,wt(this,Io,0),wt(this,Ci,0),re(this,Zr)&&re(this,Ai)){const i=re(this,Ai);let r;for(;r=i?.shift();)(n=re(this,Js))==null||n.call(this,...r)}}};let oIe=uz;lz=Symbol.toStringTag,js=new WeakMap,Ro=new WeakMap,Ks=new WeakMap,Js=new WeakMap,Jp=new WeakMap,Ci=new WeakMap,Io=new WeakMap,yi=new WeakMap,Nn=new WeakMap,Ct=new WeakMap,Xr=new WeakMap,Mo=new WeakMap,pr=new WeakMap,Fi=new WeakMap,Qs=new WeakMap,Ai=new WeakMap,qs=new WeakMap,$s=new WeakMap,Lo=new WeakMap,ea=new WeakMap,Ul=new WeakMap,Zr=new WeakMap,lb=new WeakSet,OS=function(){const e=new cb(re(this,js)),t=new cb(re(this,js));wt(this,Lo,e),wt(this,$s,t),wt(this,ub,(r,o,s=Zh.now())=>{if(t[r]=o!==0?s:0,e[r]=o,o!==0&&this.ttlAutopurge){const a=setTimeout(()=>{re(this,Po).call(this,r)&&this.delete(re(this,Nn)[r])},o+1);a.unref&&a.unref()}}),wt(this,Dh,r=>{t[r]=e[r]!==0?Zh.now():0}),wt(this,Zc,(r,o)=>{if(e[o]){const s=e[o],a=t[o];if(!s||!a)return;r.ttl=s,r.start=a,r.now=n||i();const c=r.now-a;r.remainingTTL=s-c}});let n=0;const i=()=>{const r=Zh.now();if(this.ttlResolution>0){n=r;const o=setTimeout(()=>n=0,this.ttlResolution);o.unref&&o.unref()}return r};this.getRemainingTTL=r=>{const o=re(this,yi).get(r);if(o===void 0)return 0;const s=e[o],a=t[o];if(!s||!a)return 1/0;const c=(n||i())-a;return s-c},wt(this,Po,r=>{const o=t[r],s=e[r];return!!s&&!!o&&(n||i())-o>s})},Dh=new WeakMap,Zc=new WeakMap,ub=new WeakMap,Po=new WeakMap,GS=new WeakSet,cz=function(){const e=new cb(re(this,js));wt(this,Io,0),wt(this,qs,e),wt(this,Uh,t=>{wt(this,Io,re(this,Io)-e[t]),e[t]=0}),wt(this,hb,(t,n,i,r)=>{if(ft(this,En,On).call(this,n))return 0;if(!Xc(i))if(r){if(typeof r!="function")throw new TypeError("sizeCalculation must be a function");if(i=r(n,t),!Xc(i))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return i}),wt(this,Qp,(t,n,i)=>{if(e[t]=n,re(this,Ro)){const r=re(this,Ro)-e[t];for(;re(this,Io)>r;)ft(this,qp,fb).call(this,!0)}wt(this,Io,re(this,Io)+e[t]),i&&(i.entrySize=n,i.totalCalculatedSize=re(this,Io))})},Uh=new WeakMap,Qp=new WeakMap,hb=new WeakMap,Na=new WeakSet,Dc=function*({allowStale:e=this.allowStale}={}){if(re(this,Ci))for(let t=re(this,Fi);!(!ft(this,db,VS).call(this,t)||((e||!re(this,Po).call(this,t))&&(yield t),t===re(this,pr)));)t=re(this,Mo)[t]},ka=new WeakSet,Uc=function*({allowStale:e=this.allowStale}={}){if(re(this,Ci))for(let t=re(this,pr);!(!ft(this,db,VS).call(this,t)||((e||!re(this,Po).call(this,t))&&(yield t),t===re(this,Fi)));)t=re(this,Xr)[t]},db=new WeakSet,VS=function(e){return e!==void 0&&re(this,yi).get(re(this,Nn)[e])===e},qp=new WeakSet,fb=function(e){var t,n;const i=re(this,pr),r=re(this,Nn)[i],o=re(this,Ct)[i];return re(this,Ul)&&ft(this,En,On).call(this,o)?o.__abortController.abort(new Error("evicted")):(re(this,ea)||re(this,Zr))&&(re(this,ea)&&((t=re(this,Ks))==null||t.call(this,o,r,"evict")),re(this,Zr)&&((n=re(this,Ai))==null||n.push([o,r,"evict"]))),re(this,Uh).call(this,i),e&&(re(this,Nn)[i]=void 0,re(this,Ct)[i]=void 0,re(this,Qs).push(i)),re(this,Ci)===1?(wt(this,pr,wt(this,Fi,0)),re(this,Qs).length=0):wt(this,pr,re(this,Xr)[i]),re(this,yi).delete(r),nS(this,Ci)._--,i},$p=new WeakSet,pb=function(e,t,n,i){const r=t===void 0?void 0:re(this,Ct)[t];if(ft(this,En,On).call(this,r))return r;const o=new ab,{signal:s}=n;s?.addEventListener("abort",()=>o.abort(s.reason),{signal:o.signal});const a={signal:o.signal,options:n,context:i},c=(p,m=!1)=>{const{aborted:y}=o.signal,g=n.ignoreFetchAbort&&p!==void 0;if(n.status&&(y&&!m?(n.status.fetchAborted=!0,n.status.fetchError=o.signal.reason,g&&(n.status.fetchAbortIgnored=!0)):n.status.fetchResolved=!0),y&&!g&&!m)return u(o.signal.reason);const v=d;return re(this,Ct)[t]===d&&(p===void 0?v.__staleWhileFetching?re(this,Ct)[t]=v.__staleWhileFetching:this.delete(e):(n.status&&(n.status.fetchUpdated=!0),this.set(e,p,a.options))),p},l=p=>(n.status&&(n.status.fetchRejected=!0,n.status.fetchError=p),u(p)),u=p=>{const{aborted:m}=o.signal,y=m&&n.allowStaleOnFetchAbort,g=y||n.allowStaleOnFetchRejection,v=g||n.noDeleteOnFetchRejection,S=d;if(re(this,Ct)[t]===d&&(!v||S.__staleWhileFetching===void 0?this.delete(e):y||(re(this,Ct)[t]=S.__staleWhileFetching)),g)return n.status&&S.__staleWhileFetching!==void 0&&(n.status.returnedStale=!0),S.__staleWhileFetching;if(S.__returned===S)throw p},h=(p,m)=>{var y;const g=(y=re(this,Jp))==null?void 0:y.call(this,e,r,a);g&&g instanceof Promise&&g.then(v=>p(v===void 0?void 0:v),m),o.signal.addEventListener("abort",()=>{(!n.ignoreFetchAbort||n.allowStaleOnFetchAbort)&&(p(void 0),n.allowStaleOnFetchAbort&&(p=v=>c(v,!0)))})};n.status&&(n.status.fetchDispatched=!0);const d=new Promise(h).then(c,l),f=Object.assign(d,{__abortController:o,__staleWhileFetching:r,__returned:void 0});return t===void 0?(this.set(e,f,{...a.options,status:void 0}),t=re(this,yi).get(e)):re(this,Ct)[t]=f,f},En=new WeakSet,On=function(e){if(!re(this,Ul))return!1;const t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof ab},mb=new WeakSet,FS=function(e,t){re(this,Mo)[t]=e,re(this,Xr)[e]=t},Wh=new WeakSet,e0=function(e){e!==re(this,Fi)&&(e===re(this,pr)?wt(this,pr,re(this,Xr)[e]):ft(this,mb,FS).call(this,re(this,Mo)[e],re(this,Xr)[e]),ft(this,mb,FS).call(this,re(this,Fi),e),wt(this,Fi,e))};const hz=new oIe({max:1e3}),sIe=(e,t,n)=>{const i=JSON.stringify(e.properties),r=hz.get(i);if(r)return r;const o=(()=>{switch(Fa.types[e.type]){case"Polygon":return"polygon";case"LineString":return"polyline";case"Point":return"marker";default:return}})(),s=(()=>{if(n?.type!=="simple"||!o)return;const c=aIe("",e,t,o);if(c)return LS?.(n,c)})(),a=(()=>{if(o==="polygon"){const c=s?.polygon;return{fillStyle:(c?.fill??!0)&&(c?.show??!0)?c?.fillColor:"rgba(0,0,0,0)",strokeStyle:c!=null&&c.stroke&&(c?.show??!0)?c?.strokeColor:"rgba(0,0,0,0)",lineWidth:c?.strokeWidth,lineJoin:c?.lineJoin}}if(o==="polyline"){const c=s?.polyline;return{fillStyle:(c?.strokeColor??!0)&&(c?.show??!0)?c?.strokeColor:"rgba(0,0,0,0)",strokeStyle:c!=null&&c.strokeColor&&(c?.show??!0)?c?.strokeColor:"rgba(0,0,0,0)",lineWidth:c?.strokeWidth}}if(o==="marker"){const c=s?.marker;return{fillStyle:(c?.pointColor??!0)&&(c?.show??!0)?c?.pointColor:"rgba(0,0,0,0)",strokeStyle:c!=null&&c.pointColor&&(c?.show??!0)?c?.pointColor:"rgba(0,0,0,0)",lineWidth:c?.pointSize}}})();return hz.set(i,a),a},aIe=(e,t,n,i)=>{const r=t.loadGeometry(),[o,s]=(()=>{if(i==="polygon")return["Polygon",r.map(a=>a.map(c=>[c.x,c.y]))];if(i==="polyline")return["LineString",r[0].map(a=>[a.x,a.y])];if(i==="marker")return["Point",[r[0][0].x,r[0][0].y]];throw new Error(`Unexpected appearance ${i}`)})();return{type:"feature",id:e,geometry:{type:o,coordinates:s},properties:t.properties,range:{x:n.x,y:n.y,z:n.level}}};function cIe(e){return uIe(e)===M.WindingOrder.COUNTER_CLOCKWISE}function dz(e,t){const n=e.x,i=e.y;let r=!1;for(let o=0,s=t.length-1;o<t.length;s=o++){const a=t[o].x,c=t[o].y,l=t[s].x,u=t[s].y;c>i!=u>i&&n<(l-a)*(i-c)/(u-c)+a&&(r=!r)}return r}function lIe(e,t){for(let n=0;n<e.length;n++)if(dz(t,e[n])){let i=!1;for(;n+1<e.length&&!cIe(e[n+1]);)n++,!i&&dz(t,e[n])&&(i=!0);if(!i)return!0}return!1}function uIe(e){const t=e.length;let n=e[t-1].x*(e[0].y-e[t-2].y)+e[0].x*(e[1].y-e[t-1].y);for(let i=1;i<=t-2;i++)n+=e[i].x*(e[i+1].y-e[i-1].y);if(isNaN(n))throw new Error;return n>0?M.WindingOrder.COUNTER_CLOCKWISE:M.WindingOrder.CLOCKWISE}const Wl=256;class hIe{constructor(t){st(this,"_urlTemplate"),st(this,"_parseTile"),st(this,"_tilingScheme"),st(this,"_layerNames"),st(this,"_tileWidth"),st(this,"_tileHeight"),st(this,"_pickPointRadius"),st(this,"_pickLineWidth"),st(this,"_tileCaches"),this._parseTile=dIe,this._urlTemplate=t.urlTemplate,this._tileWidth=Wl,this._tileHeight=Wl,this._layerNames=t.layerNames,this._tilingScheme=new zc,this._pickPointRadius=t.pickPointRadius??fIe,this._pickLineWidth=t.pickLineWidth??pIe}async render(t,n,i,r){const o=fz(this._urlTemplate,n);await Promise.all(this._layerNames.map(s=>this._renderCanvas(o,t,n,s,i,r)))}async _renderCanvas(t,n,i,r,o,s){if(!t)return;const a=await this._cachedTile(t),c=r.split(/, */).filter(Boolean).map(l=>a?.layers[l]);c&&(n.strokeStyle="black",n.fillStyle="black",n.lineWidth=1,n.miterLimit=2,n.setTransform(this._tileWidth*o/Wl,0,0,this._tileHeight*o/Wl,0,0),c.forEach(l=>{if(!l)return;const u=Wl/l.extent;for(let h=0;h<l.length;h++){const d=l.feature(h),f=sIe(d,i,s);if(!f)continue;n.fillStyle=f.fillStyle??n.fillStyle,n.strokeStyle=f.strokeStyle??n.strokeStyle,n.lineWidth=f.lineWidth??n.lineWidth,n.lineJoin=f.lineJoin??n.lineJoin;const p=d.loadGeometry();Fa.types[d.type]==="Polygon"?this._renderPolygon(n,p,u,(f.lineWidth??1)>0):Fa.types[d.type]==="Point"?this._renderPoint(n,p,u):Fa.types[d.type]==="LineString"?this._renderLineString(n,p,u):console.error(`Unexpected geometry type: ${d.type} in region map on tile ${[i.level,i.x,i.y].join("/")}`)}}))}_renderPolygon(t,n,i,r){t.beginPath();for(let o=0;o<n.length;o++){const s=n[o];let a=s[0];t.moveTo(a.x*i,a.y*i);for(let c=1;c<s.length;c++)a=s[c],t.lineTo(a.x*i,a.y*i);t.closePath()}r&&t.stroke(),t.fill()}_renderPoint(t,n,i){t.beginPath();for(let r=0;r<n.length;r++){const o=n[r][0],[s,a]=[o.x*i,o.y*i],c=t.lineWidth;t.beginPath(),t.arc(s,a,c,0,2*Math.PI),t.fill()}}_renderLineString(t,n,i){t.beginPath();for(let r=0;r<n.length;r++){let o=n[r][0];t.moveTo(o.x*i,o.y*i);for(let s=1;s<n[r].length;s++)o=n[r][s],t.lineTo(o.x*i,o.y*i)}t.stroke()}pickFeatures(t,n,i,r){const o=fz(this._urlTemplate,t);return this._pickFeaturesFromLayer(o,t,n,i,r)}async _pickFeaturesFromLayer(t,n,i,r,o){try{const s=await this._cachedTile(t);return s?(await Promise.all(this._layerNames.map(async a=>{const c=s.layers[a];return c?await this._pickFeatures(n,i,r,c,o)||[]:[]}))).flat():[]}catch{return[]}}async _pickFeatures(t,n,i,r,o){const s=this._tilingScheme.tileXYToNativeRectangle(t.x,t.y,t.level),a=[s.west,s.east],c=[s.north,s.south],l=function(m,y,g,v,S){const T=new M.Cartesian2;M.Cartesian2.subtract(m,new M.Cartesian2(y[0],g[0]),T);const C=new M.Cartesian2((v[1]-v[0])/(y[1]-y[0]),(S[1]-S[0])/(g[1]-g[0]));return M.Cartesian2.add(M.Cartesian2.multiplyComponents(T,C,new M.Cartesian2),new M.Cartesian2(v[0],S[0]),new M.Cartesian2)},u=[],h=[0,r.extent-1],d=(h[1]-h[0])/this._tileWidth,f=l(M.Cartesian2.fromCartesian3(this._tilingScheme.projection.project(new M.Cartographic(n,i))),a,c,h,h),p=new ib(f.x,f.y);for(let m=0;m<r.length;m++){const y=r.feature(m);if(Fa.types[y.type]==="Polygon"&&lIe(y.loadGeometry(),p)||Fa.types[y.type]==="LineString"&&kRe(y.loadGeometry(),p,pz(this._pickLineWidth,y,t)*d)||Fa.types[y.type]==="Point"&&NRe(y.loadGeometry(),p,pz(this._pickPointRadius,y,t)*d)){const g=tIe(y,t,o);g&&u.push(g)}}return u}async _cachedTile(t){var n,i;if(t){if((n=this._tileCaches)!=null&&n.has(t))return this._tileCaches.get(t);try{const r=yIe(await this._parseTile(t));return r&&((i=this._tileCaches)==null||i.set(t,r)),r}catch{return}}}clearCache(){var t;(t=this._tileCaches)==null||t.clear()}}const dIe=async e=>{try{const t=await gIe(e);return t?mIe(t):void 0}catch{return}},fIe=5,pIe=5,mIe=e=>new gRe(new yRe(e)),gIe=async e=>{if(!e){console.error("fetch request failed because request url is undefined");return}try{const t=await fetch(e);return t.ok?await t.arrayBuffer():void 0}catch{return}},yIe=e=>{var t;if(!e)return;const n={};for(const[i,r]of Object.entries(e.layers)){const o=[],s=r;for(let a=0;a<s.length;a++){const c=s.feature(a);let l;const u=(t=c.bbox)==null?void 0:t.call(c),h={...c,id:c.id,loadGeometry:()=>(l||(l=c.loadGeometry()),l),bbox:u?()=>u:void 0,toGeoJSON:c.toGeoJSON};o.push(h)}n[i]={...s,feature:a=>o[a]}}return{layers:n}},fz=(e,t)=>decodeURIComponent(e).replace("{z}",String(t.level)).replace("{x}",String(t.x)).replace("{y}",String(t.y));function pz(e,t,n){return typeof e=="number"?e:e(t,n)}var mz={},Oo={},Bl={};Object.defineProperty(Bl,"__esModule",{value:!0}),Bl.DefaultSerializer=Bl.extendSerializer=void 0;function bIe(e,t){const n=e.deserialize.bind(e),i=e.serialize.bind(e);return{deserialize(r){return t.deserialize(r,n)},serialize(r){return t.serialize(r,i)}}}Bl.extendSerializer=bIe;const gz={deserialize(e){return Object.assign(Error(e.message),{name:e.name,stack:e.stack})},serialize(e){return{__error_marker:"$$error",message:e.message,name:e.name,stack:e.stack}}},_Ie=e=>e&&typeof e=="object"&&"__error_marker"in e&&e.__error_marker==="$$error";Bl.DefaultSerializer={deserialize(e){return _Ie(e)?gz.deserialize(e):e},serialize(e){return e instanceof Error?gz.serialize(e):e}},Object.defineProperty(Oo,"__esModule",{value:!0}),Oo.serialize=Oo.deserialize=Oo.registerSerializer=void 0;const yz=Bl;let gb=yz.DefaultSerializer;function vIe(e){gb=yz.extendSerializer(gb,e)}Oo.registerSerializer=vIe;function wIe(e){return gb.deserialize(e)}Oo.deserialize=wIe;function xIe(e){return gb.serialize(e)}Oo.serialize=xIe;var bz={},Xa={},Bh={};Object.defineProperty(Bh,"__esModule",{value:!0}),Bh.getBundleURL=Bh.getBaseURL=void 0;let AS;function SIe(){return AS||(AS=EIe()),AS}Bh.getBundleURL=SIe;function EIe(){try{throw new Error}catch(e){const t=(""+e.stack).match(/(https?|file|ftp|chrome-extension|moz-extension):\/\/[^)\n]+/g);if(t)return _z(t[0])}return"/"}function _z(e){return(""+e).replace(/^((?:https?|file|ftp|chrome-extension|moz-extension):\/\/.+)?\/[^/]+(?:\?.*)?$/,"$1")+"/"}Bh.getBaseURL=_z,Object.defineProperty(Xa,"__esModule",{value:!0}),Xa.isWorkerRuntime=Xa.getWorkerImplementation=Xa.defaultPoolSize=void 0;const vz=Bh;Xa.defaultPoolSize=typeof navigator<"u"&&navigator.hardwareConcurrency?navigator.hardwareConcurrency:4;const wz=e=>/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(e);function xz(e){const t=new Blob([e],{type:"application/javascript"});return URL.createObjectURL(t)}function TIe(){if(typeof Worker>"u")return class{constructor(){throw Error("No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.")}};class e extends Worker{constructor(i,r){var o,s;typeof i=="string"&&r&&r._baseURL?i=new URL(i,r._baseURL):typeof i=="string"&&!wz(i)&&vz.getBundleURL().match(/^file:\/\//i)&&(i=new URL(i,vz.getBundleURL().replace(/\/[^\/]+$/,"/")),(!((o=r?.CORSWorkaround)!==null&&o!==void 0)||o)&&(i=xz(`importScripts(${JSON.stringify(i)});`))),typeof i=="string"&&wz(i)&&(!((s=r?.CORSWorkaround)!==null&&s!==void 0)||s)&&(i=xz(`importScripts(${JSON.stringify(i)});`)),super(i,r)}}class t extends e{constructor(i,r){const o=window.URL.createObjectURL(i);super(o,r)}static fromText(i,r){const o=new window.Blob([i],{type:"text/javascript"});return new t(o,r)}}return{blob:t,default:e}}let zS;function CIe(){return zS||(zS=TIe()),zS}Xa.getWorkerImplementation=CIe;function RIe(){const e=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!e)}Xa.isWorkerRuntime=RIe;var Sz={},Yh={},IIe={get exports(){return Yh},set exports(e){Yh=e}},NS,Ez;function MIe(){if(Ez)return NS;Ez=1;var e=1e3,t=e*60,n=t*60,i=n*24,r=i*7,o=i*365.25;NS=function(u,h){h=h||{};var d=typeof u;if(d==="string"&&u.length>0)return s(u);if(d==="number"&&isFinite(u))return h.long?c(u):a(u);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(u))};function s(u){if(u=String(u),!(u.length>100)){var h=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(u);if(h){var d=parseFloat(h[1]),f=(h[2]||"ms").toLowerCase();switch(f){case"years":case"year":case"yrs":case"yr":case"y":return d*o;case"weeks":case"week":case"w":return d*r;case"days":case"day":case"d":return d*i;case"hours":case"hour":case"hrs":case"hr":case"h":return d*n;case"minutes":case"minute":case"mins":case"min":case"m":return d*t;case"seconds":case"second":case"secs":case"sec":case"s":return d*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}}}function a(u){var h=Math.abs(u);return h>=i?Math.round(u/i)+"d":h>=n?Math.round(u/n)+"h":h>=t?Math.round(u/t)+"m":h>=e?Math.round(u/e)+"s":u+"ms"}function c(u){var h=Math.abs(u);return h>=i?l(u,h,i,"day"):h>=n?l(u,h,n,"hour"):h>=t?l(u,h,t,"minute"):h>=e?l(u,h,e,"second"):u+" ms"}function l(u,h,d,f){var p=h>=d*1.5;return Math.round(u/d)+" "+f+(p?"s":"")}return NS}function LIe(e){n.debug=n,n.default=n,n.coerce=c,n.disable=o,n.enable=r,n.enabled=s,n.humanize=MIe(),n.destroy=l,Object.keys(e).forEach(u=>{n[u]=e[u]}),n.names=[],n.skips=[],n.formatters={};function t(u){let h=0;for(let d=0;d<u.length;d++)h=(h<<5)-h+u.charCodeAt(d),h|=0;return n.colors[Math.abs(h)%n.colors.length]}n.selectColor=t;function n(u){let h,d=null,f,p;function m(...y){if(!m.enabled)return;const g=m,v=Number(new Date),S=v-(h||v);g.diff=S,g.prev=h,g.curr=v,h=v,y[0]=n.coerce(y[0]),typeof y[0]!="string"&&y.unshift("%O");let T=0;y[0]=y[0].replace(/%([a-zA-Z%])/g,(C,O)=>{if(C==="%%")return"%";T++;const V=n.formatters[O];if(typeof V=="function"){const A=y[T];C=V.call(g,A),y.splice(T,1),T--}return C}),n.formatArgs.call(g,y),(g.log||n.log).apply(g,y)}return m.namespace=u,m.useColors=n.useColors(),m.color=n.selectColor(u),m.extend=i,m.destroy=n.destroy,Object.defineProperty(m,"enabled",{enumerable:!0,configurable:!1,get:()=>d!==null?d:(f!==n.namespaces&&(f=n.namespaces,p=n.enabled(u)),p),set:y=>{d=y}}),typeof n.init=="function"&&n.init(m),m}function i(u,h){const d=n(this.namespace+(typeof h>"u"?":":h)+u);return d.log=this.log,d}function r(u){n.save(u),n.namespaces=u,n.names=[],n.skips=[];let h;const d=(typeof u=="string"?u:"").split(/[\s,]+/),f=d.length;for(h=0;h<f;h++)d[h]&&(u=d[h].replace(/\*/g,".*?"),u[0]==="-"?n.skips.push(new RegExp("^"+u.slice(1)+"$")):n.names.push(new RegExp("^"+u+"$")))}function o(){const u=[...n.names.map(a),...n.skips.map(a).map(h=>"-"+h)].join(",");return n.enable(""),u}function s(u){if(u[u.length-1]==="*")return!0;let h,d;for(h=0,d=n.skips.length;h<d;h++)if(n.skips[h].test(u))return!1;for(h=0,d=n.names.length;h<d;h++)if(n.names[h].test(u))return!0;return!1}function a(u){return u.toString().substring(2,u.toString().length-2).replace(/\.\*\?$/,"*")}function c(u){return u instanceof Error?u.stack||u.message:u}function l(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return n.enable(n.load()),n}var PIe=LIe;(function(e,t){t.formatArgs=i,t.save=r,t.load=o,t.useColors=n,t.storage=s(),t.destroy=(()=>{let c=!1;return()=>{c||(c=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function n(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function i(c){if(c[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+c[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const l="color: "+this.color;c.splice(1,0,l,"color: inherit");let u=0,h=0;c[0].replace(/%[a-zA-Z%]/g,d=>{d!=="%%"&&(u++,d==="%c"&&(h=u))}),c.splice(h,0,l)}t.log=console.debug||console.log||(()=>{});function r(c){try{c?t.storage.setItem("debug",c):t.storage.removeItem("debug")}catch{}}function o(){let c;try{c=t.storage.getItem("debug")}catch{}return!c&&typeof process<"u"&&"env"in process&&(c=process.env.DEBUG),c}function s(){try{return localStorage}catch{}}e.exports=PIe(t);const{formatters:a}=e.exports;a.j=function(c){try{return JSON.stringify(c)}catch(l){return"[UnexpectedJSONParseError]: "+l.message}}})(IIe,Yh);var OIe=globalThis&&globalThis.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})};class yb{constructor(t){this._baseObserver=t,this._pendingPromises=new Set}complete(){Promise.all(this._pendingPromises).then(()=>this._baseObserver.complete()).catch(t=>this._baseObserver.error(t))}error(t){this._baseObserver.error(t)}schedule(t){const n=Promise.all(this._pendingPromises),i=[],r=s=>i.push(s),o=Promise.resolve().then(()=>OIe(this,void 0,void 0,function*(){yield n,yield t(r),this._pendingPromises.delete(o);for(const s of i)this._baseObserver.next(s)})).catch(s=>{this._pendingPromises.delete(o),this._baseObserver.error(s)});this._pendingPromises.add(o)}}const Tz=()=>typeof Symbol=="function",t0=e=>Tz()&&!!Symbol[e],kS=e=>t0(e)?Symbol[e]:"@@"+e;t0("asyncIterator")||(Symbol.asyncIterator=Symbol.asyncIterator||Symbol.for("Symbol.asyncIterator"));const GIe=kS("iterator"),XS=kS("observable"),Cz=kS("species");function bb(e,t){const n=e[t];if(n!=null){if(typeof n!="function")throw new TypeError(n+" is not a function");return n}}function n0(e){let t=e.constructor;return t!==void 0&&(t=t[Cz],t===null&&(t=void 0)),t!==void 0?t:Go}function VIe(e){return e instanceof Go}function Hh(e){Hh.log?Hh.log(e):setTimeout(()=>{throw e},0)}function _b(e){Promise.resolve().then(()=>{try{e()}catch(t){Hh(t)}})}function Rz(e){const t=e._cleanup;if(t!==void 0&&(e._cleanup=void 0,!!t))try{if(typeof t=="function")t();else{const n=bb(t,"unsubscribe");n&&n.call(t)}}catch(n){Hh(n)}}function ZS(e){e._observer=void 0,e._queue=void 0,e._state="closed"}function FIe(e){const t=e._queue;if(t){e._queue=void 0,e._state="ready";for(const n of t)if(Iz(e,n.type,n.value),e._state==="closed")break}}function Iz(e,t,n){e._state="running";const i=e._observer;try{const r=i?bb(i,t):void 0;switch(t){case"next":r&&r.call(i,n);break;case"error":if(ZS(e),r)r.call(i,n);else throw n;break;case"complete":ZS(e),r&&r.call(i);break}}catch(r){Hh(r)}e._state==="closed"?Rz(e):e._state==="running"&&(e._state="ready")}function DS(e,t,n){if(e._state!=="closed"){if(e._state==="buffering"){e._queue=e._queue||[],e._queue.push({type:t,value:n});return}if(e._state!=="ready"){e._state="buffering",e._queue=[{type:t,value:n}],_b(()=>FIe(e));return}Iz(e,t,n)}}class AIe{constructor(t,n){this._cleanup=void 0,this._observer=t,this._queue=void 0,this._state="initializing";const i=new zIe(this);try{this._cleanup=n.call(void 0,i)}catch(r){i.error(r)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(ZS(this),Rz(this))}}class zIe{constructor(t){this._subscription=t}get closed(){return this._subscription._state==="closed"}next(t){DS(this._subscription,"next",t)}error(t){DS(this._subscription,"error",t)}complete(){DS(this._subscription,"complete")}}class Go{constructor(t){if(!(this instanceof Go))throw new TypeError("Observable cannot be called as a function");if(typeof t!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=t}subscribe(t,n,i){return(typeof t!="object"||t===null)&&(t={next:t,error:n,complete:i}),new AIe(t,this._subscriber)}pipe(t,...n){let i=this;for(const r of[t,...n])i=r(i);return i}tap(t,n,i){const r=typeof t!="object"||t===null?{next:t,error:n,complete:i}:t;return new Go(o=>this.subscribe({next(s){r.next&&r.next(s),o.next(s)},error(s){r.error&&r.error(s),o.error(s)},complete(){r.complete&&r.complete(),o.complete()},start(s){r.start&&r.start(s)}}))}forEach(t){return new Promise((n,i)=>{if(typeof t!="function"){i(new TypeError(t+" is not a function"));return}function r(){o.unsubscribe(),n(void 0)}const o=this.subscribe({next(s){try{t(s,r)}catch(a){i(a),o.unsubscribe()}},error(s){i(s)},complete(){n(void 0)}})})}map(t){if(typeof t!="function")throw new TypeError(t+" is not a function");const n=n0(this);return new n(i=>this.subscribe({next(r){let o=r;try{o=t(r)}catch(s){return i.error(s)}i.next(o)},error(r){i.error(r)},complete(){i.complete()}}))}filter(t){if(typeof t!="function")throw new TypeError(t+" is not a function");const n=n0(this);return new n(i=>this.subscribe({next(r){try{if(!t(r))return}catch(o){return i.error(o)}i.next(r)},error(r){i.error(r)},complete(){i.complete()}}))}reduce(t,n){if(typeof t!="function")throw new TypeError(t+" is not a function");const i=n0(this),r=arguments.length>1;let o=!1,s=n;return new i(a=>this.subscribe({next(c){const l=!o;if(o=!0,!l||r)try{s=t(s,c)}catch(u){return a.error(u)}else s=c},error(c){a.error(c)},complete(){if(!o&&!r)return a.error(new TypeError("Cannot reduce an empty sequence"));a.next(s),a.complete()}}))}concat(...t){const n=n0(this);return new n(i=>{let r,o=0;function s(a){r=a.subscribe({next(c){i.next(c)},error(c){i.error(c)},complete(){o===t.length?(r=void 0,i.complete()):s(n.from(t[o++]))}})}return s(this),()=>{r&&(r.unsubscribe(),r=void 0)}})}flatMap(t){if(typeof t!="function")throw new TypeError(t+" is not a function");const n=n0(this);return new n(i=>{const r=[],o=this.subscribe({next(a){let c;if(t)try{c=t(a)}catch(u){return i.error(u)}else c=a;const l=n.from(c).subscribe({next(u){i.next(u)},error(u){i.error(u)},complete(){const u=r.indexOf(l);u>=0&&r.splice(u,1),s()}});r.push(l)},error(a){i.error(a)},complete(){s()}});function s(){o.closed&&r.length===0&&i.complete()}return()=>{r.forEach(a=>a.unsubscribe()),o.unsubscribe()}})}[XS](){return this}static from(t){const n=typeof this=="function"?this:Go;if(t==null)throw new TypeError(t+" is not an object");const i=bb(t,XS);if(i){const r=i.call(t);if(Object(r)!==r)throw new TypeError(r+" is not an object");return VIe(r)&&r.constructor===n?r:new n(o=>r.subscribe(o))}if(t0("iterator")){const r=bb(t,GIe);if(r)return new n(o=>{_b(()=>{if(!o.closed){for(const s of r.call(t))if(o.next(s),o.closed)return;o.complete()}})})}if(Array.isArray(t))return new n(r=>{_b(()=>{if(!r.closed){for(const o of t)if(r.next(o),r.closed)return;r.complete()}})});throw new TypeError(t+" is not observable")}static of(...t){const n=typeof this=="function"?this:Go;return new n(i=>{_b(()=>{if(!i.closed){for(const r of t)if(i.next(r),i.closed)return;i.complete()}})})}static get[Cz](){return this}}Tz()&&Object.defineProperty(Go,Symbol("extensions"),{value:{symbol:XS,hostReportError:Hh},configurable:!0});const Yl=Go;function Hl(e){typeof e=="function"?e():e&&typeof e.unsubscribe=="function"&&e.unsubscribe()}var NIe=globalThis&&globalThis.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})};function kIe(e){return t=>new Yl(n=>{const i=new yb(n),r=t.subscribe({complete(){i.complete()},error(o){i.error(o)},next(o){i.schedule(s=>NIe(this,void 0,void 0,function*(){(yield e(o))&&s(o)}))}});return()=>Hl(r)})}function XIe(e){return e&&t0("asyncIterator")&&e[Symbol.asyncIterator]}function ZIe(e){return e&&t0("iterator")&&e[Symbol.iterator]}var DIe=globalThis&&globalThis.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})},UIe=globalThis&&globalThis.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof __values=="function"?__values(e):e[Symbol.iterator](),n={},i("next"),i("throw"),i("return"),n[Symbol.asyncIterator]=function(){return this},n);function i(o){n[o]=e[o]&&function(s){return new Promise(function(a,c){s=e[o](s),r(a,c,s.done,s.value)})}}function r(o,s,a,c){Promise.resolve(c).then(function(l){o({value:l,done:a})},s)}};function WIe(e){return t=>new Yl(n=>{const i=new yb(n),r=t.subscribe({complete(){i.complete()},error(o){i.error(o)},next(o){i.schedule(s=>DIe(this,void 0,void 0,function*(){var a,c;const l=yield e(o);if(ZIe(l)||XIe(l))try{for(var u=UIe(l),h;h=yield u.next(),!h.done;){const d=h.value;s(d)}}catch(d){a={error:d}}finally{try{h&&!h.done&&(c=u.return)&&(yield c.call(u))}finally{if(a)throw a.error}}else l.map(d=>s(d))}))}});return()=>Hl(r)})}function BIe(e){return new Go(t=>{let n=0;const i=setInterval(()=>{t.next(n++)},e);return()=>clearInterval(i)})}var YIe=globalThis&&globalThis.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})};function HIe(e){return t=>new Yl(n=>{const i=new yb(n),r=t.subscribe({complete(){i.complete()},error(o){i.error(o)},next(o){i.schedule(s=>YIe(this,void 0,void 0,function*(){const a=yield e(o);s(a)}))}});return()=>Hl(r)})}function jIe(...e){return e.length===0?Go.from([]):new Go(t=>{let n=0;const i=e.map(o=>o.subscribe({error(s){t.error(s),r()},next(s){t.next(s)},complete(){++n===e.length&&(t.complete(),r())}})),r=()=>{i.forEach(o=>Hl(o))};return r})}class KIe extends Yl{constructor(){super(t=>(this._observers.add(t),()=>this._observers.delete(t))),this._observers=new Set}next(t){for(const n of this._observers)n.next(t)}error(t){for(const n of this._observers)n.error(t)}complete(){for(const t of this._observers)t.complete()}}const Mz=KIe;function JIe(e){const t=new Mz;let n,i=0;return new Yl(r=>{n||(n=e.subscribe(t));const o=t.subscribe(r);return i++,()=>{i--,o.unsubscribe(),i===0&&(Hl(n),n=void 0)}})}var QIe=globalThis&&globalThis.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})};function qIe(e,t){return n=>new Yl(i=>{let r,o=0;const s=new yb(i),a=n.subscribe({complete(){s.complete()},error(c){s.error(c)},next(c){s.schedule(l=>QIe(this,void 0,void 0,function*(){r=yield e(o===0?typeof t>"u"?c:t:r,c,o++),l(r)}))}});return()=>Hl(a)})}const $Ie=Object.freeze(Object.defineProperty({__proto__:null,Observable:Yl,Subject:Mz,filter:kIe,flatMap:WIe,interval:BIe,map:HIe,merge:jIe,multicast:JIe,scan:qIe,unsubscribe:Hl},Symbol.toStringTag,{value:"Module"})),vb=zCe($Ie);var wb={};Object.defineProperty(wb,"__esModule",{value:!0}),wb.allSettled=void 0;function eMe(e){return Promise.all(e.map(t=>{const n=o=>({status:"fulfilled",value:o}),i=o=>({status:"rejected",reason:o}),r=Promise.resolve(t);try{return r.then(n,i)}catch(o){return Promise.reject(o)}}))}wb.allSettled=eMe;var Lz={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.PoolEventType=void 0,(function(t){t.initialized="initialized",t.taskCanceled="taskCanceled",t.taskCompleted="taskCompleted",t.taskFailed="taskFailed",t.taskQueued="taskQueued",t.taskQueueDrained="taskQueueDrained",t.taskStart="taskStart",t.terminated="terminated"})(e.PoolEventType||(e.PoolEventType={}))})(Lz);var i0={},Dr={};Object.defineProperty(Dr,"__esModule",{value:!0}),Dr.$worker=Dr.$transferable=Dr.$terminate=Dr.$events=Dr.$errors=void 0,Dr.$errors=Symbol("thread.errors"),Dr.$events=Symbol("thread.events"),Dr.$terminate=Symbol("thread.terminate"),Dr.$transferable=Symbol("thread.transferable"),Dr.$worker=Symbol("thread.worker"),Object.defineProperty(i0,"__esModule",{value:!0}),i0.Thread=void 0;const US=Dr;function Pz(e){throw Error(e)}i0.Thread={errors(e){return e[US.$errors]||Pz("Error observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},events(e){return e[US.$events]||Pz("Events observable not found. Make sure to pass a thread instance as returned by the spawn() promise.")},terminate(e){return e[US.$terminate]()}},(function(e){var t=Ei&&Ei.__awaiter||function(g,v,S,T){function C(O){return O instanceof S?O:new S(function(V){V(O)})}return new(S||(S=Promise))(function(O,V){function A(N){try{k(T.next(N))}catch(P){V(P)}}function G(N){try{k(T.throw(N))}catch(P){V(P)}}function k(N){N.done?O(N.value):C(N.value).then(A,G)}k((T=T.apply(g,v||[])).next())})},n=Ei&&Ei.__importDefault||function(g){return g&&g.__esModule?g:{default:g}};Object.defineProperty(e,"__esModule",{value:!0}),e.Pool=e.Thread=e.PoolEventType=void 0;const i=n(Yh),r=vb,o=wb,s=Xa,a=Lz;Object.defineProperty(e,"PoolEventType",{enumerable:!0,get:function(){return a.PoolEventType}});const c=i0;Object.defineProperty(e,"Thread",{enumerable:!0,get:function(){return c.Thread}});let l=1;function u(g){const v=[];for(let S=0;S<g;S++)v.push(S);return v}function h(g){return new Promise(v=>setTimeout(v,g))}function d(g,v){return g.reduce((S,T)=>[...S,...v(T)],[])}function f(g){return g.replace(/\W/g," ").trim().replace(/\s+/g,"-")}function p(g,v){return u(v).map(()=>({init:g(),runningTasks:[]}))}class m{constructor(v,S){this.eventSubject=new r.Subject,this.initErrors=[],this.isClosing=!1,this.nextTaskID=1,this.taskQueue=[];const T=typeof S=="number"?{size:S}:S||{},{size:C=s.defaultPoolSize}=T;this.debug=i.default(`threads:pool:${f(T.name||String(l++))}`),this.options=T,this.workers=p(v,C),this.eventObservable=r.multicast(r.Observable.from(this.eventSubject)),Promise.all(this.workers.map(O=>O.init)).then(()=>this.eventSubject.next({type:a.PoolEventType.initialized,size:this.workers.length}),O=>{this.debug("Error while initializing pool worker:",O),this.eventSubject.error(O),this.initErrors.push(O)})}findIdlingWorker(){const{concurrency:v=1}=this.options;return this.workers.find(S=>S.runningTasks.length<v)}runPoolTask(v,S){return t(this,void 0,void 0,function*(){const T=this.workers.indexOf(v)+1;this.debug(`Running task #${S.id} on worker #${T}...`),this.eventSubject.next({type:a.PoolEventType.taskStart,taskID:S.id,workerID:T});try{const C=yield S.run(yield v.init);this.debug(`Task #${S.id} completed successfully`),this.eventSubject.next({type:a.PoolEventType.taskCompleted,returnValue:C,taskID:S.id,workerID:T})}catch(C){this.debug(`Task #${S.id} failed`),this.eventSubject.next({type:a.PoolEventType.taskFailed,taskID:S.id,error:C,workerID:T})}})}run(v,S){return t(this,void 0,void 0,function*(){const T=t(this,void 0,void 0,function*(){const C=()=>{v.runningTasks=v.runningTasks.filter(O=>O!==T)};yield h(0);try{yield this.runPoolTask(v,S)}finally{C(),this.isClosing||this.scheduleWork()}});v.runningTasks.push(T)})}scheduleWork(){this.debug("Attempt de-queueing a task in order to run it...");const v=this.findIdlingWorker();if(!v)return;const S=this.taskQueue.shift();if(!S){this.debug("Task queue is empty"),this.eventSubject.next({type:a.PoolEventType.taskQueueDrained});return}this.run(v,S)}taskCompletion(v){return new Promise((S,T)=>{const C=this.events().subscribe(O=>{O.type===a.PoolEventType.taskCompleted&&O.taskID===v?(C.unsubscribe(),S(O.returnValue)):O.type===a.PoolEventType.taskFailed&&O.taskID===v?(C.unsubscribe(),T(O.error)):O.type===a.PoolEventType.terminated&&(C.unsubscribe(),T(Error("Pool has been terminated before task was run.")))})})}settled(v=!1){return t(this,void 0,void 0,function*(){const S=()=>d(this.workers,O=>O.runningTasks),T=[],C=this.eventObservable.subscribe(O=>{O.type===a.PoolEventType.taskFailed&&T.push(O.error)});return this.initErrors.length>0?Promise.reject(this.initErrors[0]):v&&this.taskQueue.length===0?(yield o.allSettled(S()),T):(yield new Promise((O,V)=>{const A=this.eventObservable.subscribe({next(G){G.type===a.PoolEventType.taskQueueDrained&&(A.unsubscribe(),O(void 0))},error:V})}),yield o.allSettled(S()),C.unsubscribe(),T)})}completed(v=!1){return t(this,void 0,void 0,function*(){const S=this.settled(v),T=new Promise((O,V)=>{const A=this.eventObservable.subscribe({next(G){G.type===a.PoolEventType.taskQueueDrained?(A.unsubscribe(),O(S)):G.type===a.PoolEventType.taskFailed&&(A.unsubscribe(),V(G.error))},error:V})}),C=yield Promise.race([S,T]);if(C.length>0)throw C[0]})}events(){return this.eventObservable}queue(v){const{maxQueuedJobs:S=1/0}=this.options;if(this.isClosing)throw Error("Cannot schedule pool tasks after terminate() has been called.");if(this.initErrors.length>0)throw this.initErrors[0];const T=this.nextTaskID++,C=this.taskCompletion(T);C.catch(V=>{this.debug(`Task #${T} errored:`,V)});const O={id:T,run:v,cancel:()=>{this.taskQueue.indexOf(O)!==-1&&(this.taskQueue=this.taskQueue.filter(V=>V!==O),this.eventSubject.next({type:a.PoolEventType.taskCanceled,taskID:O.id}))},then:C.then.bind(C)};if(this.taskQueue.length>=S)throw Error(`Maximum number of pool tasks queued. Refusing to queue another one.
6086
6086
  This usually happens for one of two reasons: We are either at peak workload right now or some tasks just won't finish, thus blocking the pool.`);return this.debug(`Queueing task #${O.id}...`),this.taskQueue.push(O),this.eventSubject.next({type:a.PoolEventType.taskQueued,taskID:O.id}),this.scheduleWork(),O}terminate(v){return t(this,void 0,void 0,function*(){this.isClosing=!0,v||(yield this.completed(!0)),this.eventSubject.next({type:a.PoolEventType.terminated,remainingQueue:[...this.taskQueue]}),this.eventSubject.complete(),yield Promise.all(this.workers.map(S=>t(this,void 0,void 0,function*(){return c.Thread.terminate(yield S.init)})))})}}m.EventType=a.PoolEventType;function y(g,v){return new m(g,v)}y.EventType=a.PoolEventType,e.Pool=y})(Sz);var xb={},Sb={};Object.defineProperty(Sb,"__esModule",{value:!0}),Sb.createPromiseWithResolver=void 0;const tMe=()=>{};function nMe(){let e=!1,t,n=tMe;return[new Promise(i=>{e?i(t):n=i}),i=>{e=!0,t=i,n(t)}]}Sb.createPromiseWithResolver=nMe;var Oz={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerEventType=void 0,(function(t){t.internalError="internalError",t.message="message",t.termination="termination"})(e.WorkerEventType||(e.WorkerEventType={}))})(Oz);var jh={},Eb={};Object.defineProperty(Eb,"__esModule",{value:!0}),Eb.ObservablePromise=void 0;const iMe=vb,rMe=()=>{},oMe=e=>e,Gz=e=>Promise.resolve().then(e);function sMe(e){throw e}function aMe(e){return e&&typeof e.then=="function"}class WS extends iMe.Observable{constructor(t){super(n=>{const i=this,r=Object.assign(Object.assign({},n),{complete(){n.complete(),i.onCompletion()},error(o){n.error(o),i.onError(o)},next(o){n.next(o),i.onNext(o)}});try{return this.initHasRun=!0,t(r)}catch(o){r.error(o)}}),this.initHasRun=!1,this.fulfillmentCallbacks=[],this.rejectionCallbacks=[],this.firstValueSet=!1,this.state="pending"}onNext(t){this.firstValueSet||(this.firstValue=t,this.firstValueSet=!0)}onError(t){this.state="rejected",this.rejection=t;for(const n of this.rejectionCallbacks)Gz(()=>n(t))}onCompletion(){this.state="fulfilled";for(const t of this.fulfillmentCallbacks)Gz(()=>t(this.firstValue))}then(t,n){const i=t||oMe,r=n||sMe;let o=!1;return new Promise((s,a)=>{const c=u=>{if(!o){o=!0;try{s(r(u))}catch(h){a(h)}}},l=u=>{try{s(i(u))}catch(h){c(h)}};if(this.initHasRun||this.subscribe({error:c}),this.state==="fulfilled")return s(i(this.firstValue));if(this.state==="rejected")return o=!0,s(r(this.rejection));this.fulfillmentCallbacks.push(l),this.rejectionCallbacks.push(c)})}catch(t){return this.then(void 0,t)}finally(t){const n=t||rMe;return this.then(i=>(n(),i),()=>n())}static from(t){return aMe(t)?new WS(n=>{const i=o=>{n.next(o),n.complete()},r=o=>{n.error(o)};t.then(i,r)}):super.from(t)}}Eb.ObservablePromise=WS;var Za={};Object.defineProperty(Za,"__esModule",{value:!0}),Za.Transfer=Za.isTransferDescriptor=void 0;const Vz=Dr;function cMe(e){return!(!e||typeof e!="object")}function lMe(e){return e&&typeof e=="object"&&e[Vz.$transferable]}Za.isTransferDescriptor=lMe;function uMe(e,t){if(!t){if(!cMe(e))throw Error();t=[e]}return{[Vz.$transferable]:!0,send:e,transferables:t}}Za.Transfer=uMe;var BS={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerMessageType=e.MasterMessageType=void 0,(function(t){t.cancel="cancel",t.run="run"})(e.MasterMessageType||(e.MasterMessageType={})),(function(t){t.error="error",t.init="init",t.result="result",t.running="running",t.uncaughtError="uncaughtError"})(e.WorkerMessageType||(e.WorkerMessageType={}))})(BS);var hMe=Ei&&Ei.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(jh,"__esModule",{value:!0}),jh.createProxyModule=jh.createProxyFunction=void 0;const dMe=hMe(Yh),Fz=vb,r0=Oo,Az=Eb,fMe=Za,o0=BS,zz=dMe.default("threads:master:messages");let pMe=1;const mMe=e=>Array.from(new Set(e)),gMe=e=>e&&e.type===o0.WorkerMessageType.error,yMe=e=>e&&e.type===o0.WorkerMessageType.result,bMe=e=>e&&e.type===o0.WorkerMessageType.running;function _Me(e,t){return new Fz.Observable(n=>{let i;const r=o=>{if(zz("Message from worker:",o.data),!(!o.data||o.data.uid!==t)){if(bMe(o.data))i=o.data.resultType;else if(yMe(o.data))i==="promise"?(typeof o.data.payload<"u"&&n.next(r0.deserialize(o.data.payload)),n.complete(),e.removeEventListener("message",r)):(o.data.payload&&n.next(r0.deserialize(o.data.payload)),o.data.complete&&(n.complete(),e.removeEventListener("message",r)));else if(gMe(o.data)){const s=r0.deserialize(o.data.error);n.error(s),e.removeEventListener("message",r)}}};return e.addEventListener("message",r),()=>{if(i==="observable"||!i){const o={type:o0.MasterMessageType.cancel,uid:t};e.postMessage(o)}e.removeEventListener("message",r)}})}function vMe(e){if(e.length===0)return{args:[],transferables:[]};const t=[],n=[];for(const i of e)fMe.isTransferDescriptor(i)?(t.push(r0.serialize(i.send)),n.push(...i.transferables)):t.push(r0.serialize(i));return{args:t,transferables:n.length===0?n:mMe(n)}}function Nz(e,t){return(...n)=>{const i=pMe++,{args:r,transferables:o}=vMe(n),s={type:o0.MasterMessageType.run,uid:i,method:t,args:r};zz("Sending command to run function to worker:",s);try{e.postMessage(s,o)}catch(a){return Az.ObservablePromise.from(Promise.reject(a))}return Az.ObservablePromise.from(Fz.multicast(_Me(e,i)))}}jh.createProxyFunction=Nz;function wMe(e,t){const n={};for(const i of t)n[i]=Nz(e,i);return n}jh.createProxyModule=wMe;var YS=Ei&&Ei.__awaiter||function(e,t,n,i){function r(o){return o instanceof n?o:new n(function(s){s(o)})}return new(n||(n=Promise))(function(o,s){function a(u){try{l(i.next(u))}catch(h){s(h)}}function c(u){try{l(i.throw(u))}catch(h){s(h)}}function l(u){u.done?o(u.value):r(u.value).then(a,c)}l((i=i.apply(e,t||[])).next())})},xMe=Ei&&Ei.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(xb,"__esModule",{value:!0}),xb.spawn=void 0;const HS=xMe(Yh),SMe=vb,EMe=Oo,TMe=Sb,Tb=Dr,Cb=Oz,kz=jh,CMe=HS.default("threads:master:messages"),RMe=HS.default("threads:master:spawn"),Xz=HS.default("threads:master:thread-utils"),IMe=e=>e&&e.type==="init",MMe=e=>e&&e.type==="uncaughtError",LMe=typeof process<"u"&&process.env.THREADS_WORKER_INIT_TIMEOUT?Number.parseInt(process.env.THREADS_WORKER_INIT_TIMEOUT,10):1e4;function PMe(e,t,n){return YS(this,void 0,void 0,function*(){let i;const r=new Promise((s,a)=>{i=setTimeout(()=>a(Error(n)),t)}),o=yield Promise.race([e,r]);return clearTimeout(i),o})}function OMe(e){return new Promise((t,n)=>{const i=r=>{CMe("Message from worker before finishing initialization:",r.data),IMe(r.data)?(e.removeEventListener("message",i),t(r.data)):MMe(r.data)&&(e.removeEventListener("message",i),n(EMe.deserialize(r.data.error)))};e.addEventListener("message",i)})}function GMe(e,t){return new SMe.Observable(n=>{const i=o=>{const s={type:Cb.WorkerEventType.message,data:o.data};n.next(s)},r=o=>{Xz("Unhandled promise rejection event in thread:",o);const s={type:Cb.WorkerEventType.internalError,error:Error(o.reason)};n.next(s)};e.addEventListener("message",i),e.addEventListener("unhandledrejection",r),t.then(()=>{const o={type:Cb.WorkerEventType.termination};e.removeEventListener("message",i),e.removeEventListener("unhandledrejection",r),n.next(o),n.complete()})})}function VMe(e){const[t,n]=TMe.createPromiseWithResolver();return{terminate:()=>YS(this,void 0,void 0,function*(){Xz("Terminating worker"),yield e.terminate(),n()}),termination:t}}function Zz(e,t,n,i){const r=n.filter(o=>o.type===Cb.WorkerEventType.internalError).map(o=>o.error);return Object.assign(e,{[Tb.$errors]:r,[Tb.$events]:n,[Tb.$terminate]:i,[Tb.$worker]:t})}function FMe(e,t){return YS(this,void 0,void 0,function*(){RMe("Initializing new thread");const n=t&&t.timeout?t.timeout:LMe,i=(yield PMe(OMe(e),n,`Timeout: Did not receive an init message from worker after ${n}ms. Make sure the worker calls expose().`)).exposed,{termination:r,terminate:o}=VMe(e),s=GMe(e,r);if(i.type==="function"){const a=kz.createProxyFunction(e);return Zz(a,e,s,o)}else if(i.type==="module"){const a=kz.createProxyModule(e,i.methods);return Zz(a,e,s,o)}else{const a=i.type;throw Error(`Worker init message states unexpected type of expose(): ${a}`)}})}xb.spawn=FMe,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Worker=e.BlobWorker=e.isWorkerRuntime=e.Thread=e.spawn=e.Pool=void 0;const t=Xa;Object.defineProperty(e,"isWorkerRuntime",{enumerable:!0,get:function(){return t.isWorkerRuntime}});var n=Sz;Object.defineProperty(e,"Pool",{enumerable:!0,get:function(){return n.Pool}});var i=xb;Object.defineProperty(e,"spawn",{enumerable:!0,get:function(){return i.spawn}});var r=i0;Object.defineProperty(e,"Thread",{enumerable:!0,get:function(){return r.Thread}}),e.BlobWorker=t.getWorkerImplementation().blob,e.Worker=t.getWorkerImplementation().default})(bz);var Dz={},AMe=e=>e?typeof Symbol.observable=="symbol"&&typeof e[Symbol.observable]=="function"?e===e[Symbol.observable]():typeof e["@@observable"]=="function"?e===e["@@observable"]():!1:!1,jS={};Object.defineProperty(jS,"__esModule",{value:!0});const zMe=function(){const e=typeof self<"u"&&typeof Window<"u"&&self instanceof Window;return!!(typeof self<"u"&&self.postMessage&&!e)},NMe=function(e,t){self.postMessage(e,t)},kMe=function(e){const t=i=>{e(i.data)},n=()=>{self.removeEventListener("message",t)};return self.addEventListener("message",t),n};jS.default={isWorkerRuntime:zMe,postMessageToMaster:NMe,subscribeToMasterMessages:kMe},(function(e){var t=Ei&&Ei.__awaiter||function(G,k,N,P){function w(x){return x instanceof N?x:new N(function(I){I(x)})}return new(N||(N=Promise))(function(x,I){function X(H){try{Y(P.next(H))}catch(J){I(J)}}function D(H){try{Y(P.throw(H))}catch(J){I(J)}}function Y(H){H.done?x(H.value):w(H.value).then(X,D)}Y((P=P.apply(G,k||[])).next())})},n=Ei&&Ei.__importDefault||function(G){return G&&G.__esModule?G:{default:G}};Object.defineProperty(e,"__esModule",{value:!0}),e.expose=e.isWorkerRuntime=e.Transfer=e.registerSerializer=void 0;const i=n(AMe),r=Oo,o=Za,s=BS,a=n(jS);var c=Oo;Object.defineProperty(e,"registerSerializer",{enumerable:!0,get:function(){return c.registerSerializer}});var l=Za;Object.defineProperty(e,"Transfer",{enumerable:!0,get:function(){return l.Transfer}}),e.isWorkerRuntime=a.default.isWorkerRuntime;let u=!1;const h=new Map,d=G=>G&&G.type===s.MasterMessageType.cancel,f=G=>G&&G.type===s.MasterMessageType.run,p=G=>i.default(G)||m(G);function m(G){return G&&typeof G=="object"&&typeof G.subscribe=="function"}function y(G){return o.isTransferDescriptor(G)?{payload:G.send,transferables:G.transferables}:{payload:G,transferables:void 0}}function g(){const G={type:s.WorkerMessageType.init,exposed:{type:"function"}};a.default.postMessageToMaster(G)}function v(G){const k={type:s.WorkerMessageType.init,exposed:{type:"module",methods:G}};a.default.postMessageToMaster(k)}function S(G,k){const{payload:N,transferables:P}=y(k),w={type:s.WorkerMessageType.error,uid:G,error:r.serialize(N)};a.default.postMessageToMaster(w,P)}function T(G,k,N){const{payload:P,transferables:w}=y(N),x={type:s.WorkerMessageType.result,uid:G,complete:k?!0:void 0,payload:P};a.default.postMessageToMaster(x,w)}function C(G,k){const N={type:s.WorkerMessageType.running,uid:G,resultType:k};a.default.postMessageToMaster(N)}function O(G){try{const k={type:s.WorkerMessageType.uncaughtError,error:r.serialize(G)};a.default.postMessageToMaster(k)}catch(k){console.error(`Not reporting uncaught error back to master thread as it occured while reporting an uncaught error already.
6087
6087
  Latest error:`,k,`
6088
- Original error:`,G)}}function V(G,k,N){return t(this,void 0,void 0,function*(){let P;try{P=k(...N)}catch(x){return S(G,x)}const w=p(P)?"observable":"promise";if(C(G,w),p(P)){const x=P.subscribe(I=>T(G,!1,r.serialize(I)),I=>{S(G,r.serialize(I)),h.delete(G)},()=>{T(G,!0),h.delete(G)});h.set(G,x)}else try{const x=yield P;T(G,!0,r.serialize(x))}catch(x){S(G,r.serialize(x))}})}function A(G){if(!a.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(u)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(u=!0,typeof G=="function")a.default.subscribeToMasterMessages(k=>{f(k)&&!k.method&&V(k.uid,G,k.args.map(r.deserialize))}),g();else if(typeof G=="object"&&G){a.default.subscribeToMasterMessages(N=>{f(N)&&N.method&&V(N.uid,G[N.method],N.args.map(r.deserialize))});const k=Object.keys(G).filter(N=>typeof G[N]=="function");v(k)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${G}`);a.default.subscribeToMasterMessages(k=>{if(d(k)){const N=k.uid,P=h.get(N);P&&(P.unsubscribe(),h.delete(N))}})}e.expose=A,typeof self<"u"&&typeof self.addEventListener=="function"&&a.default.isWorkerRuntime()&&(self.addEventListener("error",G=>{setTimeout(()=>O(G.error||G),250)}),self.addEventListener("unhandledrejection",G=>{const k=G.reason;k&&typeof k.message=="string"&&setTimeout(()=>O(k),250)})),typeof process<"u"&&typeof process.on=="function"&&a.default.isWorkerRuntime()&&(process.on("uncaughtException",G=>{setTimeout(()=>O(G),250)}),process.on("unhandledRejection",G=>{G&&typeof G.message=="string"&&setTimeout(()=>O(G),250)}))})(Dz),(function(e){var t=Ei&&Ei.__createBinding||(Object.create?function(a,c,l,u){u===void 0&&(u=l),Object.defineProperty(a,u,{enumerable:!0,get:function(){return c[l]}})}:function(a,c,l,u){u===void 0&&(u=l),a[u]=c[l]}),n=Ei&&Ei.__exportStar||function(a,c){for(var l in a)l!=="default"&&!Object.prototype.hasOwnProperty.call(c,l)&&t(c,a,l)};Object.defineProperty(e,"__esModule",{value:!0}),e.Transfer=e.DefaultSerializer=e.expose=e.registerSerializer=void 0;var i=Oo;Object.defineProperty(e,"registerSerializer",{enumerable:!0,get:function(){return i.registerSerializer}}),n(bz,e);var r=Dz;Object.defineProperty(e,"expose",{enumerable:!0,get:function(){return r.expose}});var o=Bl;Object.defineProperty(e,"DefaultSerializer",{enumerable:!0,get:function(){return o.DefaultSerializer}});var s=Za;Object.defineProperty(e,"Transfer",{enumerable:!0,get:function(){return s.Transfer}})})(mz);const Wc=ACe(mz);Wc.registerSerializer;const XMe=Wc.spawn;Wc.BlobWorker,Wc.DefaultSerializer;const ZMe=Wc.Pool;Wc.Thread;const DMe=Wc.Transfer;Wc.Worker;const Uz="dmFyIFJsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgYmw9KFcsSyxydCk9PksgaW4gVz9SbChXLEsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJ0fSk6V1tLXT1ydDt2YXIgTD0oVyxLLHJ0KT0+KGJsKFcsdHlwZW9mIEshPSJzeW1ib2wiP0srIiI6SyxydCkscnQpLGFyPShXLEsscnQpPT57aWYoIUsuaGFzKFcpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrcnQpfTt2YXIgYz0oVyxLLHJ0KT0+KGFyKFcsSywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxydD9ydC5jYWxsKFcpOksuZ2V0KFcpKSxCPShXLEsscnQpPT57aWYoSy5oYXMoVykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7SyBpbnN0YW5jZW9mIFdlYWtTZXQ/Sy5hZGQoVyk6Sy5zZXQoVyxydCl9LFA9KFcsSyxydCxfZSk9PihhcihXLEssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxfZT9fZS5jYWxsKFcscnQpOksuc2V0KFcscnQpLHJ0KSx4bj0oVyxLLHJ0LF9lKT0+KHtzZXQgXyhJdCl7UChXLEssSXQscnQpfSxnZXQgXygpe3JldHVybiBjKFcsSyxfZSl9fSksQz0oVyxLLHJ0KT0+KGFyKFcsSywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIikscnQpOyhmdW5jdGlvbigpe3ZhciBraSxDZSxDdCxPdCxOdCxNdCxNZSxodCxGdCxhdCxldCx2LF90LFR0LEV0LGZ0LEx0LGx0LFB0LHZ0LFJ0LER0LGVlLHB0LGtlLGhyLGZlLHF0LFZlLGJ0LHBuLFZpLGxlLEZlLFhlLCR0LG5lLGt0LHJlLFdlLGNyLFRsLExlLE9uLFBlLFRuLFksbnQsemUsdXIsZGUscWU7InVzZSBzdHJpY3QiO3ZhciBXPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBydD17fSxfZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsSXQ9e30scGU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHBlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxwZS5EZWZhdWx0U2VyaWFsaXplcj1wZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBYaSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19cGUuZXh0ZW5kU2VyaWFsaXplcj1YaTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFdpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7cGUuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBXaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksSXQuc2VyaWFsaXplPUl0LmRlc2VyaWFsaXplPUl0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9cGU7bGV0IEtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIHppKHQpe0tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoS2UsdCl9SXQucmVnaXN0ZXJTZXJpYWxpemVyPXppO2Z1bmN0aW9uIEhpKHQpe3JldHVybiBLZS5kZXNlcmlhbGl6ZSh0KX1JdC5kZXNlcmlhbGl6ZT1IaTtmdW5jdGlvbiBxaSh0KXtyZXR1cm4gS2Uuc2VyaWFsaXplKHQpfUl0LnNlcmlhbGl6ZT1xaTt2YXIgaWU9e30sZ3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxndC4kd29ya2VyPWd0LiR0cmFuc2ZlcmFibGU9Z3QuJHRlcm1pbmF0ZT1ndC4kZXZlbnRzPWd0LiRlcnJvcnM9dm9pZCAwLGd0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksZ3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxndC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLGd0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksZ3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaWUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGllLlRyYW5zZmVyPWllLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1ndDtmdW5jdGlvbiBLaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIFlpKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19aWUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9WWk7ZnVuY3Rpb24gWmkodCxlKXtpZighZSl7aWYoIUtpKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1pZS5UcmFuc2Zlcj1aaTt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBRaT1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0sSmk9ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LHRvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpRaSxwb3N0TWVzc2FnZVRvTWFzdGVyOkppLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6dG99LGZ1bmN0aW9uKHQpe3ZhciBlPVcmJlcuX19hd2FpdGVyfHxmdW5jdGlvbihULFUsWCxvdCl7ZnVuY3Rpb24gQnQoY3Qpe3JldHVybiBjdCBpbnN0YW5jZW9mIFg/Y3Q6bmV3IFgoZnVuY3Rpb24oVXQpe1V0KGN0KX0pfXJldHVybiBuZXcoWHx8KFg9UHJvbWlzZSkpKGZ1bmN0aW9uKGN0LFV0KXtmdW5jdGlvbiB5bihFZSl7dHJ5e0hlKG90Lm5leHQoRWUpKX1jYXRjaChzcil7VXQoc3IpfX1mdW5jdGlvbiBBbihFZSl7dHJ5e0hlKG90LnRocm93KEVlKSl9Y2F0Y2goc3Ipe1V0KHNyKX19ZnVuY3Rpb24gSGUoRWUpe0VlLmRvbmU/Y3QoRWUudmFsdWUpOkJ0KEVlLnZhbHVlKS50aGVuKHluLEFuKX1IZSgob3Q9b3QuYXBwbHkoVCxVfHxbXSkpLm5leHQoKSl9KX0sbj1XJiZXLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oVCl7cmV0dXJuIFQmJlQuX19lc01vZHVsZT9UOntkZWZhdWx0OlR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5leHBvc2U9dC5pc1dvcmtlclJ1bnRpbWU9dC5UcmFuc2Zlcj10LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3Qgcj1uKF9lKSxpPUl0LG89aWUscz1FcixoPW4oUm4pO3ZhciBhPUl0O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZWdpc3RlclNlcmlhbGl6ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLnJlZ2lzdGVyU2VyaWFsaXplcn19KTt2YXIgZj1pZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiVHJhbnNmZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLlRyYW5zZmVyfX0pLHQuaXNXb3JrZXJSdW50aW1lPWguZGVmYXVsdC5pc1dvcmtlclJ1bnRpbWU7bGV0IGQ9ITE7Y29uc3QgXz1uZXcgTWFwLFM9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5jYW5jZWwsTz1UPT5UJiZULnR5cGU9PT1zLk1hc3Rlck1lc3NhZ2VUeXBlLnJ1bix3PVQ9PnIuZGVmYXVsdChUKXx8YihUKTtmdW5jdGlvbiBiKFQpe3JldHVybiBUJiZ0eXBlb2YgVD09Im9iamVjdCImJnR5cGVvZiBULnN1YnNjcmliZT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBNKFQpe3JldHVybiBvLmlzVHJhbnNmZXJEZXNjcmlwdG9yKFQpP3twYXlsb2FkOlQuc2VuZCx0cmFuc2ZlcmFibGVzOlQudHJhbnNmZXJhYmxlc306e3BheWxvYWQ6VCx0cmFuc2ZlcmFibGVzOnZvaWQgMH19ZnVuY3Rpb24gbSgpe2NvbnN0IFQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6ImZ1bmN0aW9uIn19O2guZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFQpfWZ1bmN0aW9uIEcoVCl7Y29uc3QgVT17dHlwZTpzLldvcmtlck1lc3NhZ2VUeXBlLmluaXQsZXhwb3NlZDp7dHlwZToibW9kdWxlIixtZXRob2RzOlR9fTtoLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihVKX1mdW5jdGlvbiBRKFQsVSl7Y29uc3R7cGF5bG9hZDpYLHRyYW5zZmVyYWJsZXM6b3R9PU0oVSksQnQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZShYKX07aC5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQnQsb3QpfWZ1bmN0aW9uIEgoVCxVLFgpe2NvbnN0e3BheWxvYWQ6b3QsdHJhbnNmZXJhYmxlczpCdH09TShYKSxjdD17dHlwZTpzLldvcmtlck1lc3NhZ2VUeXBlLnJlc3VsdCx1aWQ6VCxjb21wbGV0ZTpVPyEwOnZvaWQgMCxwYXlsb2FkOm90fTtoLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihjdCxCdCl9ZnVuY3Rpb24gaXQoVCxVKXtjb25zdCBYPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOlV9O2guZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFgpfWZ1bmN0aW9uIHl0KFQpe3RyeXtjb25zdCBVPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07aC5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoVSl9Y2F0Y2goVSl7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsVSxgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIEF0KFQsVSxYKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IG90O3RyeXtvdD1VKC4uLlgpfWNhdGNoKGN0KXtyZXR1cm4gUShULGN0KX1jb25zdCBCdD13KG90KT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQsQnQpLHcob3QpKXtjb25zdCBjdD1vdC5zdWJzY3JpYmUoVXQ9PkgoVCwhMSxpLnNlcmlhbGl6ZShVdCkpLFV0PT57UShULGkuc2VyaWFsaXplKFV0KSksXy5kZWxldGUoVCl9LCgpPT57SChULCEwKSxfLmRlbGV0ZShUKX0pO18uc2V0KFQsY3QpfWVsc2UgdHJ5e2NvbnN0IGN0PXlpZWxkIG90O0goVCwhMCxpLnNlcmlhbGl6ZShjdCkpfWNhdGNoKGN0KXtRKFQsaS5zZXJpYWxpemUoY3QpKX19KX1mdW5jdGlvbiB2ZShUKXtpZighaC5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKWguZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFU9PntPKFUpJiYhVS5tZXRob2QmJkF0KFUudWlkLFQsVS5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxtKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe2guZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFg9PntPKFgpJiZYLm1ldGhvZCYmQXQoWC51aWQsVFtYLm1ldGhvZF0sWC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBVPU9iamVjdC5rZXlzKFQpLmZpbHRlcihYPT50eXBlb2YgVFtYXT09ImZ1bmN0aW9uIik7RyhVKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO2guZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFU9PntpZihTKFUpKXtjb25zdCBYPVUudWlkLG90PV8uZ2V0KFgpO290JiYob3QudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZShYKSl9fSl9dC5leHBvc2U9dmUsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZoLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+eXQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgVT1ULnJlYXNvbjtVJiZ0eXBlb2YgVS5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+eXQoVSksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZoLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pnl0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+eXQoVCksMjUwKX0pKX0ocnQpO3ZhciBibj1LKHJ0KTtjb25zdCBlbz1ibi5leHBvc2U7Ym4ucmVnaXN0ZXJTZXJpYWxpemVyLGJuLlRyYW5zZmVyO2Z1bmN0aW9uIEkodCxlKXtyZXR1cm4gdD8/ZX1JLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIGcodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJihnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZyksZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSxnLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IGcoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gbm8odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiB5ZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgZyhubyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyBnKHllKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IGcoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IGcoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgZyhgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgZyhgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgZyh5ZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IGcoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgdT1zdCxWdD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07VnQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sVnQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LFZ0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSxWdC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0sVnQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSxWdC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSxWdC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSxWdC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj1WdDtjb25zdCBBPXt9O0EuRVBTSUxPTjE9LjEsQS5FUFNJTE9OMj0uMDEsQS5FUFNJTE9OMz0uMDAxLEEuRVBTSUxPTjQ9MWUtNCxBLkVQU0lMT041PTFlLTUsQS5FUFNJTE9ONj0xZS02LEEuRVBTSUxPTjc9MWUtNyxBLkVQU0lMT044PTFlLTgsQS5FUFNJTE9OOT0xZS05LEEuRVBTSUxPTjEwPTFlLTEwLEEuRVBTSUxPTjExPTFlLTExLEEuRVBTSUxPTjEyPTFlLTEyLEEuRVBTSUxPTjEzPTFlLTEzLEEuRVBTSUxPTjE0PTFlLTE0LEEuRVBTSUxPTjE1PTFlLTE1LEEuRVBTSUxPTjE2PTFlLTE2LEEuRVBTSUxPTjE3PTFlLTE3LEEuRVBTSUxPTjE4PTFlLTE4LEEuRVBTSUxPTjE5PTFlLTE5LEEuRVBTSUxPTjIwPTFlLTIwLEEuRVBTSUxPTjIxPTFlLTIxLEEuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUsQS5TT0xBUl9SQURJVVM9Njk1NWU1LEEuTFVOQVJfUkFESVVTPTE3Mzc0MDAsQS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LEEuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCxBLnNpZ249SShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSxBLnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0sQS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9SShlLDI1NSksTWF0aC5yb3VuZCgoQS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0sQS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1JKGUsMjU1KSxBLmNsYW1wKHQsMCxlKS9lKjItMX0sQS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOkEuY2xhbXAoKHQtZSkvbiwwLDEpfSxBLnNpbmg9SShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLEEuY29zaD1JKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSksQS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0sQS5QST1NYXRoLlBJLEEuT05FX09WRVJfUEk9MS9NYXRoLlBJLEEuUElfT1ZFUl9UV089TWF0aC5QSS8yLEEuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMsQS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LEEuUElfT1ZFUl9TSVg9TWF0aC5QSS82LEEuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIsQS5UV09fUEk9MipNYXRoLlBJLEEuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSksQS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAsQS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEksQS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9QS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCxBLnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCpBLlJBRElBTlNfUEVSX0RFR1JFRX0sQS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqQS5ERUdSRUVTX1BFUl9SQURJQU59LEEuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPUEuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0sQS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIEEuY2xhbXAodCwtMSpBLlBJX09WRVJfVFdPLEEuUElfT1ZFUl9UV08pfSxBLm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LUEuUEkmJnQ8PUEuUEk/dDpBLnplcm9Ub1R3b1BpKHQrQS5QSSktQS5QSX0sQS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9QS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT1BLm1vZCh0LEEuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8QS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPkEuRVBTSUxPTjE0P0EuVFdPX1BJOmV9LEEubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IGcoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIEEuc2lnbih0KT09PUEuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LEEuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgZygibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1JKG4sMCkscj1JKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0sQS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IGcoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyBnKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IGcoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSxBLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyBnKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyBnKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSxBLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgZygiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgZygiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0sQS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgZygiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgZygiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTtBLmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgZygiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0sQS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPUkobiwwKSwhcCh0KSl0aHJvdyBuZXcgZygibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyBnKCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LEEuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IGcoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0sQS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyBnKCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LEEucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IGcoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0sQS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLHUudHlwZU9mLm51bWJlcigibWluIixlKSx1LnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjtBLnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSxBLm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LEEucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiBBLm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSxBLmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKEEuY2xhbXAodCwtMSwxKSl9LEEuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oQS5jbGFtcCh0LC0xLDEpKX0sQS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LEEubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSxBLmNicnQ9SShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSksQS5sb2cyPUkoTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSksQS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSxBLmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSxBLmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2YubnVtYmVyKCJ4Iix0KSx1LnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyBnKCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPUEuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP0EuUElfT1ZFUl9UV08tcjpyLHI9dDwwP0EuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9QTtmdW5jdGlvbiB4KHQsZSl7dGhpcy54PUkodCwwKSx0aGlzLnk9SShlLDApfXguZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IHgodCxlKX0seC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgeCh0LngsdC55KX0seC5mcm9tQ2FydGVzaWFuMz14LmNsb25lLHguZnJvbUNhcnRlc2lhbjQ9eC5jbG9uZSx4LnBhY2tlZExlbmd0aD0yLHgucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUuZGVmaW5lZCgiYXJyYXkiLGUpLG49SShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0seC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LmRlZmluZWQoImFycmF5Iix0KSxlPUkoZSwwKSxwKG4pfHwobj1uZXcgeCksbi54PXRbZSsrXSxuLnk9dFtlXSxufSx4LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyBnKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpeC5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSx4LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYodS5kZWZpbmVkKCJhcnJheSIsdCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IGcoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09eC51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSx4LmZyb21BcnJheT14LnVucGFjayx4Lm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0seC5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LHgubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LHgubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LHguY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7dS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLHUudHlwZU9mLm9iamVjdCgibWF4IixuKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSx4Lm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LHgubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoeC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgWmU9bmV3IHg7eC5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHguc3VidHJhY3QodCxlLFplKSx4Lm1hZ25pdHVkZShaZSl9LHguZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseC5zdWJ0cmFjdCh0LGUsWmUpLHgubWFnbml0dWRlU3F1YXJlZChaZSl9LHgubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPXgubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgZygibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LHguZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSx4LmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSx4Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LHguZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LHguYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0seC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LHgubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0seC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0seC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSx4LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyB4O3gubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksdS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHUudHlwZU9mLm51bWJlcigidCIsbiksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLHgubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9eC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLHguYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyB4LHhyPW5ldyB4O3guYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseC5ub3JtYWxpemUodCxBcikseC5ub3JtYWxpemUoZSx4ciksUi5hY29zQ2xhbXBlZCh4LmRvdChBcix4cikpfTtjb25zdCBybz1uZXcgeDt4Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj14Lm5vcm1hbGl6ZSh0LHJvKTtyZXR1cm4geC5hYnMobixuKSxuLng8PW4ueT9lPXguY2xvbmUoeC5VTklUX1gsZSk6ZT14LmNsb25lKHguVU5JVF9ZLGUpLGV9LHguZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0seC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0seC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0seC5aRVJPPU9iamVjdC5mcmVlemUobmV3IHgoMCwwKSkseC5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgeCgxLDEpKSx4LlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyB4KDEsMCkpLHguVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IHgoMCwxKSkseC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHguY2xvbmUodGhpcyx0KX0seC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB4LmVxdWFscyh0aGlzLHQpfSx4LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSx4LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gbCh0LGUsbil7dGhpcy54PUkodCwwKSx0aGlzLnk9SShlLDApLHRoaXMuej1JKG4sMCl9bC5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBsKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1JKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sbC5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBsKHQsZSxuKX0sbC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBsKHQueCx0LnksdC56KX0sbC5mcm9tQ2FydGVzaWFuND1sLmNsb25lLGwucGFja2VkTGVuZ3RoPTMsbC5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS5kZWZpbmVkKCJhcnJheSIsZSksbj1JKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGwudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS5kZWZpbmVkKCJhcnJheSIsdCksZT1JKGUsMCkscChuKXx8KG49bmV3IGwpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxsLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyBnKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpbC5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxsLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYodS5kZWZpbmVkKCJhcnJheSIsdCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IGcoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09bC51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxsLmZyb21BcnJheT1sLnVucGFjayxsLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGwubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sbC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx1LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGwubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxsLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe3UudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUudHlwZU9mLm9iamVjdCgibWluIixlKSx1LnR5cGVPZi5vYmplY3QoIm1heCIsbiksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxsLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sbC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChsLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBRZT1uZXcgbDtsLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksbC5zdWJ0cmFjdCh0LGUsUWUpLGwubWFnbml0dWRlKFFlKX0sbC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxsLnN1YnRyYWN0KHQsZSxRZSksbC5tYWduaXR1ZGVTcXVhcmVkKFFlKX0sbC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49bC5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgZygibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGwuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGwubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sbC5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sbC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxsLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sbC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sbC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGwubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sbC5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBPcj1uZXcgbDtsLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHUudHlwZU9mLm9iamVjdCgiZW5kIixlKSx1LnR5cGVPZi5udW1iZXIoInQiLG4pLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxsLm11bHRpcGx5QnlTY2FsYXIoZSxuLE9yKSxyPWwubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxsLmFkZChPcixyLHIpfTtjb25zdCBKZT1uZXcgbCxnbj1uZXcgbDtsLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksbC5ub3JtYWxpemUodCxKZSksbC5ub3JtYWxpemUoZSxnbik7Y29uc3Qgbj1sLmRvdChKZSxnbikscj1sLm1hZ25pdHVkZShsLmNyb3NzKEplLGduLEplKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgaW89bmV3IGw7bC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49bC5ub3JtYWxpemUodCxpbyk7cmV0dXJuIGwuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1sLmNsb25lKGwuVU5JVF9YLGUpOmU9bC5jbG9uZShsLlVOSVRfWixlKTpuLnk8PW4uej9lPWwuY2xvbmUobC5VTklUX1ksZSk6ZT1sLmNsb25lKGwuVU5JVF9aLGUpLGV9LGwucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7dS5kZWZpbmVkKCJhIix0KSx1LmRlZmluZWQoImIiLGUpLHUuZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWwuZG90KHQsZSkvbC5kb3QoZSxlKTtyZXR1cm4gbC5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sbC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGwuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sbC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sbC5jcm9zcz1mdW5jdGlvbih0LGUsbil7dS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsaD1lLnksYT1lLnosZj1pKmEtbypoLGQ9bypzLXIqYSxfPXIqaC1pKnM7cmV0dXJuIG4ueD1mLG4ueT1kLG4uej1fLG59LGwubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxsLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHUudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx1LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksbC5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGwsQWU9bmV3IGw7Y29uc3Qgb289bmV3IGwoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2wuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXt1LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksdS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1JKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOm9vLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWwubm9ybWFsaXplKG10LG10KSxsLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LEFlKTtjb25zdCBoPU1hdGguc3FydChsLmRvdChtdCxBZSkpO3JldHVybiBBZT1sLmRpdmlkZUJ5U2NhbGFyKEFlLGgsQWUpLG10PWwubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgbCksbC5hZGQoQWUsbXQsaSl9LGwuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYodS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IGcoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSxoPWkvMjtuW2hdPWwuZnJvbURlZ3JlZXMobyxzLDAsZSxuW2hdKX1yZXR1cm4gbn0sbC5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9aS8yO25baF09bC5mcm9tUmFkaWFucyhvLHMsMCxlLG5baF0pfXJldHVybiBufSxsLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9dFtpKzJdLGE9aS8zO25bYV09bC5mcm9tRGVncmVlcyhvLHMsaCxlLG5bYV0pfXJldHVybiBufSxsLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9dFtpKzJdLGE9aS8zO25bYV09bC5mcm9tUmFkaWFucyhvLHMsaCxlLG5bYV0pfXJldHVybiBufSxsLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgbCgwLDAsMCkpLGwuT05FPU9iamVjdC5mcmVlemUobmV3IGwoMSwxLDEpKSxsLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBsKDEsMCwwKSksbC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgbCgwLDEsMCkpLGwuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGwoMCwwLDEpKSxsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gbC5jbG9uZSh0aGlzLHQpfSxsLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGwuZXF1YWxzKHRoaXMsdCl9LGwucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBsLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IHNvPW5ldyBsLGFvPW5ldyBsO2Z1bmN0aW9uIFRyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyBnKCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyBnKCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LGg9dC56LGE9ZS54LGY9ZS55LGQ9ZS56LF89bypvKmEqYSxTPXMqcypmKmYsTz1oKmgqZCpkLHc9XytTK08sYj1NYXRoLnNxcnQoMS93KSxNPWwubXVsdGlwbHlCeVNjYWxhcih0LGIsc28pO2lmKHc8cilyZXR1cm4gaXNGaW5pdGUoYik/bC5jbG9uZShNLGkpOnZvaWQgMDtjb25zdCBtPW4ueCxHPW4ueSxRPW4ueixIPWFvO0gueD1NLngqbSoyLEgueT1NLnkqRyoyLEguej1NLnoqUSoyO2xldCBpdD0oMS1iKSpsLm1hZ25pdHVkZSh0KS8oLjUqbC5tYWduaXR1ZGUoSCkpLHl0PTAsQXQsdmUsVCxVLFgsb3QsQnQsY3QsVXQseW4sQW47ZG97aXQtPXl0LFQ9MS8oMStpdCptKSxVPTEvKDEraXQqRyksWD0xLygxK2l0KlEpLG90PVQqVCxCdD1VKlUsY3Q9WCpYLFV0PW90KlQseW49QnQqVSxBbj1jdCpYLEF0PV8qb3QrUypCdCtPKmN0LTEsdmU9XypVdCptK1MqeW4qRytPKkFuKlE7Y29uc3QgSGU9LTIqdmU7eXQ9QXQvSGV9d2hpbGUoTWF0aC5hYnMoQXQpPlIuRVBTSUxPTjEyKTtyZXR1cm4gcChpKT8oaS54PW8qVCxpLnk9cypVLGkuej1oKlgsaSk6bmV3IGwobypULHMqVSxoKlgpfWZ1bmN0aW9uIHoodCxlLG4pe3RoaXMubG9uZ2l0dWRlPUkodCwwKSx0aGlzLmxhdGl0dWRlPUkoZSwwKSx0aGlzLmhlaWdodD1JKG4sMCl9ei5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHUudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLG49SShuLDApLHAocik/KHIubG9uZ2l0dWRlPXQsci5sYXRpdHVkZT1lLHIuaGVpZ2h0PW4scik6bmV3IHoodCxlLG4pfSx6LmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB1LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksdS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1SLnRvUmFkaWFucyh0KSxlPVIudG9SYWRpYW5zKGUpLHouZnJvbVJhZGlhbnModCxlLG4scil9O2NvbnN0IGhvPW5ldyBsLGNvPW5ldyBsLHVvPW5ldyBsLGZvPW5ldyBsKDEvNjM3ODEzNywxLzYzNzgxMzcsMS82MzU2NzUyMzE0MjQ1MTc5ZS05KSxsbz1uZXcgbCgxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KSksRW89Ui5FUFNJTE9OMTt6LmZyb21DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9cChlKT9lLm9uZU92ZXJSYWRpaTpmbyxpPXAoZSk/ZS5vbmVPdmVyUmFkaWlTcXVhcmVkOmxvLG89cChlKT9lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOkVvLHM9VHIodCxyLGksbyxjbyk7aWYoIXAocykpcmV0dXJuO2xldCBoPWwubXVsdGlwbHlDb21wb25lbnRzKHMsaSxobyk7aD1sLm5vcm1hbGl6ZShoLGgpO2NvbnN0IGE9bC5zdWJ0cmFjdCh0LHMsdW8pLGY9TWF0aC5hdGFuMihoLnksaC54KSxkPU1hdGguYXNpbihoLnopLF89Ui5zaWduKGwuZG90KGEsdCkpKmwubWFnbml0dWRlKGEpO3JldHVybiBwKG4pPyhuLmxvbmdpdHVkZT1mLG4ubGF0aXR1ZGU9ZCxuLmhlaWdodD1fLG4pOm5ldyB6KGYsZCxfKX0sei50b0NhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUuZGVmaW5lZCgiY2FydG9ncmFwaGljIix0KSxsLmZyb21SYWRpYW5zKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQsZSxuKX0sei5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXQubG9uZ2l0dWRlLGUubGF0aXR1ZGU9dC5sYXRpdHVkZSxlLmhlaWdodD10LmhlaWdodCxlKTpuZXcgeih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX0sei5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQubG9uZ2l0dWRlPT09ZS5sb25naXR1ZGUmJnQubGF0aXR1ZGU9PT1lLmxhdGl0dWRlJiZ0LmhlaWdodD09PWUuaGVpZ2h0fSx6LmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPUkobiwwKSx0PT09ZXx8cCh0KSYmcChlKSYmTWF0aC5hYnModC5sb25naXR1ZGUtZS5sb25naXR1ZGUpPD1uJiZNYXRoLmFicyh0LmxhdGl0dWRlLWUubGF0aXR1ZGUpPD1uJiZNYXRoLmFicyh0LmhlaWdodC1lLmhlaWdodCk8PW59LHouWkVSTz1PYmplY3QuZnJlZXplKG5ldyB6KDAsMCwwKSksei5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHouY2xvbmUodGhpcyx0KX0sei5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB6LmVxdWFscyh0aGlzLHQpfSx6LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHouZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9LHoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMubG9uZ2l0dWRlfSwgJHt0aGlzLmxhdGl0dWRlfSwgJHt0aGlzLmhlaWdodH0pYH07ZnVuY3Rpb24gUnIodCxlLG4scil7ZT1JKGUsMCksbj1JKG4sMCkscj1JKHIsMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIngiLGUsMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInkiLG4sMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLHIsMCksdC5fcmFkaWk9bmV3IGwoZSxuLHIpLHQuX3JhZGlpU3F1YXJlZD1uZXcgbChlKmUsbipuLHIqciksdC5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgbChlKmUqZSplLG4qbipuKm4scipyKnIqciksdC5fb25lT3ZlclJhZGlpPW5ldyBsKGU9PT0wPzA6MS9lLG49PT0wPzA6MS9uLHI9PT0wPzA6MS9yKSx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBsKGU9PT0wPzA6MS8oZSplKSxuPT09MD8wOjEvKG4qbikscj09PTA/MDoxLyhyKnIpKSx0Ll9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsbixyKSx0Ll9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsbixyKSx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPVIuRVBTSUxPTjEsdC5fcmFkaWlTcXVhcmVkLnohPT0wJiYodC5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dC5fcmFkaWlTcXVhcmVkLngvdC5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIGoodCxlLG4pe3RoaXMuX3JhZGlpPXZvaWQgMCx0aGlzLl9yYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3JhZGlpVG9UaGVGb3VydGg9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaT12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fbWluaW11bVJhZGl1cz12b2lkIDAsdGhpcy5fbWF4aW11bVJhZGl1cz12b2lkIDAsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD12b2lkIDAsdGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dm9pZCAwLFJyKHRoaXMsdCxlLG4pfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGoucHJvdG90eXBlLHtyYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpfX0scmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlTcXVhcmVkfX0scmFkaWlUb1RoZUZvdXJ0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpVG9UaGVGb3VydGh9fSxvbmVPdmVyUmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWl9fSxvbmVPdmVyUmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZH19LG1pbmltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzfX0sbWF4aW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXN9fX0pLGouY2xvbmU9ZnVuY3Rpb24odCxlKXtpZighcCh0KSlyZXR1cm47Y29uc3Qgbj10Ll9yYWRpaTtyZXR1cm4gcChlKT8obC5jbG9uZShuLGUuX3JhZGlpKSxsLmNsb25lKHQuX3JhZGlpU3F1YXJlZCxlLl9yYWRpaVNxdWFyZWQpLGwuY2xvbmUodC5fcmFkaWlUb1RoZUZvdXJ0aCxlLl9yYWRpaVRvVGhlRm91cnRoKSxsLmNsb25lKHQuX29uZU92ZXJSYWRpaSxlLl9vbmVPdmVyUmFkaWkpLGwuY2xvbmUodC5fb25lT3ZlclJhZGlpU3F1YXJlZCxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkKSxlLl9taW5pbXVtUmFkaXVzPXQuX21pbmltdW1SYWRpdXMsZS5fbWF4aW11bVJhZGl1cz10Ll9tYXhpbXVtUmFkaXVzLGUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKTpuZXcgaihuLngsbi55LG4ueil9LGouZnJvbUNhcnRlc2lhbjM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChlKXx8KGU9bmV3IGopLHAodCkmJlJyKGUsdC54LHQueSx0LnopLGV9LGouV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgaig2Mzc4MTM3LDYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSkpLGouVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgaigxLDEsMSkpLGouTU9PTj1PYmplY3QuZnJlZXplKG5ldyBqKFIuTFVOQVJfUkFESVVTLFIuTFVOQVJfUkFESVVTLFIuTFVOQVJfUkFESVVTKSksai5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGouY2xvbmUodGhpcyx0KX0sai5wYWNrZWRMZW5ndGg9bC5wYWNrZWRMZW5ndGgsai5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS5kZWZpbmVkKCJhcnJheSIsZSksbj1JKG4sMCksbC5wYWNrKHQuX3JhZGlpLGUsbiksZX0sai51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3UuZGVmaW5lZCgiYXJyYXkiLHQpLGU9SShlLDApO2NvbnN0IHI9bC51bnBhY2sodCxlKTtyZXR1cm4gai5mcm9tQ2FydGVzaWFuMyhyLG4pfSxqLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1sLm5vcm1hbGl6ZSxqLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRvZ3JhcGhpYyIsdCk7Y29uc3Qgbj10LmxvbmdpdHVkZSxyPXQubGF0aXR1ZGUsaT1NYXRoLmNvcyhyKSxvPWkqTWF0aC5jb3Mobikscz1pKk1hdGguc2luKG4pLGg9TWF0aC5zaW4ocik7cmV0dXJuIHAoZSl8fChlPW5ldyBsKSxlLng9byxlLnk9cyxlLno9aCxsLm5vcm1hbGl6ZShlLGUpfSxqLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlKXtpZighbC5lcXVhbHNFcHNpbG9uKHQsbC5aRVJPLFIuRVBTSUxPTjE0KSlyZXR1cm4gcChlKXx8KGU9bmV3IGwpLGU9bC5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLGUpLGwubm9ybWFsaXplKGUsZSl9O2NvbnN0IF9vPW5ldyBsLHBvPW5ldyBsO2oucHJvdG90eXBlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1fbyxyPXBvO3RoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKHQsbiksbC5tdWx0aXBseUNvbXBvbmVudHModGhpcy5fcmFkaWlTcXVhcmVkLG4scik7Y29uc3QgaT1NYXRoLnNxcnQobC5kb3QobixyKSk7cmV0dXJuIGwuZGl2aWRlQnlTY2FsYXIocixpLHIpLGwubXVsdGlwbHlCeVNjYWxhcihuLHQuaGVpZ2h0LG4pLHAoZSl8fChlPW5ldyBsKSxsLmFkZChyLG4sZSl9LGoucHJvdG90eXBlLmNhcnRvZ3JhcGhpY0FycmF5VG9DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsdCk7Y29uc3Qgbj10Lmxlbmd0aDtwKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCByPTA7cjxuO3IrKyllW3JdPXRoaXMuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4odFtyXSxlW3JdKTtyZXR1cm4gZX07Y29uc3QgeW89bmV3IGwsQW89bmV3IGwseG89bmV3IGw7ai5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0LEFvKTtpZighcChuKSlyZXR1cm47Y29uc3Qgcj10aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbChuLHlvKSxpPWwuc3VidHJhY3QodCxuLHhvKSxvPU1hdGguYXRhbjIoci55LHIueCkscz1NYXRoLmFzaW4oci56KSxoPVIuc2lnbihsLmRvdChpLHQpKSpsLm1hZ25pdHVkZShpKTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9byxlLmxhdGl0dWRlPXMsZS5oZWlnaHQ9aCxlKTpuZXcgeihvLHMsaCl9LGoucHJvdG90eXBlLmNhcnRlc2lhbkFycmF5VG9DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydGVzaWFucyIsdCk7Y29uc3Qgbj10Lmxlbmd0aDtwKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCByPTA7cjxuOysrcillW3JdPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtyXSxlW3JdKTtyZXR1cm4gZX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBUcih0LHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsZSl9LGoucHJvdG90eXBlLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxwKGUpfHwoZT1uZXcgbCk7Y29uc3Qgbj10Lngscj10LnksaT10Lnosbz10aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHM9MS9NYXRoLnNxcnQobipuKm8ueCtyKnIqby55K2kqaSpvLnopO3JldHVybiBsLm11bHRpcGx5QnlTY2FsYXIodCxzLGUpfSxqLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChlKXx8KGU9bmV3IGwpLGwubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fb25lT3ZlclJhZGlpLGUpfSxqLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgbCksbC5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9yYWRpaSxlKX0sai5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzPT09dHx8cCh0KSYmbC5lcXVhbHModGhpcy5fcmFkaWksdC5fcmFkaWkpfSxqLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfSxqLnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIix0KSwhUi5lcXVhbHNFcHNpbG9uKHRoaXMuX3JhZGlpLngsdGhpcy5fcmFkaWkueSxSLkVQU0lMT04xNSkpdGhyb3cgbmV3IGcoIkVsbGlwc29pZCBtdXN0IGJlIGFuIGVsbGlwc29pZCBvZiByZXZvbHV0aW9uIChyYWRpaS54ID09IHJhZGlpLnkpIik7dS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJFbGxpcHNvaWQucmFkaWkueiIsdGhpcy5fcmFkaWkueiwwKSxlPUkoZSwwKTtjb25zdCByPXRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaO2lmKHAobil8fChuPW5ldyBsKSxuLng9MCxuLnk9MCxuLno9dC56KigxLXIpLCEoTWF0aC5hYnMobi56KT49dGhpcy5fcmFkaWkuei1lKSlyZXR1cm4gbn07Y29uc3QgT289Wy4xNDg4NzQzMzg5ODE2MywuNDMzMzk1Mzk0MTI5MjUsLjY3OTQwOTU2ODI5OTAyLC44NjUwNjMzNjY2ODg5OCwuOTczOTA2NTI4NTE3MTcsMF0sVG89Wy4yOTU1MjQyMjQ3MTQ3NSwuMjY5MjY2NzE5MzA5OTksLjIxOTA4NjM2MjUxNTk4LC4xNDk0NTEzNDkxNTA1OCwuMDY2NjcxMzQ0MzA4Njg0LDBdO2Z1bmN0aW9uIGJyKHQsZSxuKXt1LnR5cGVPZi5udW1iZXIoImEiLHQpLHUudHlwZU9mLm51bWJlcigiYiIsZSksdS50eXBlT2YuZnVuYygiZnVuYyIsbik7Y29uc3Qgcj0uNSooZSt0KSxpPS41KihlLXQpO2xldCBvPTA7Zm9yKGxldCBzPTA7czw1O3MrKyl7Y29uc3QgaD1pKk9vW3NdO28rPVRvW3NdKihuKHIraCkrbihyLWgpKX1yZXR1cm4gbyo9aSxvfWoucHJvdG90eXBlLnN1cmZhY2VBcmVhPWZ1bmN0aW9uKHQpe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQud2VzdDtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10LnNvdXRoLGk9dC5ub3J0aDtmb3IoO248ZTspbis9Ui5UV09fUEk7Y29uc3Qgbz10aGlzLl9yYWRpaVNxdWFyZWQscz1vLngsaD1vLnksYT1vLnosZj1zKmg7cmV0dXJuIGJyKHIsaSxmdW5jdGlvbihkKXtjb25zdCBfPU1hdGguY29zKGQpLFM9TWF0aC5zaW4oZCk7cmV0dXJuIE1hdGguY29zKGQpKmJyKGUsbixmdW5jdGlvbihPKXtjb25zdCB3PU1hdGguY29zKE8pLGI9TWF0aC5zaW4oTyk7cmV0dXJuIE1hdGguc3FydChmKlMqUythKihoKncqdytzKmIqYikqXypfKX0pfSl9O2Z1bmN0aW9uIE4odCxlLG4scil7dGhpcy53ZXN0PUkodCwwKSx0aGlzLnNvdXRoPUkoZSwwKSx0aGlzLmVhc3Q9SShuLDApLHRoaXMubm9ydGg9SShyLDApfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE4ucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE4uY29tcHV0ZVdpZHRoKHRoaXMpfX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTi5jb21wdXRlSGVpZ2h0KHRoaXMpfX19KSxOLnBhY2tlZExlbmd0aD00LE4ucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUuZGVmaW5lZCgiYXJyYXkiLGUpLG49SShuLDApLGVbbisrXT10Lndlc3QsZVtuKytdPXQuc291dGgsZVtuKytdPXQuZWFzdCxlW25dPXQubm9ydGgsZX0sTi51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LmRlZmluZWQoImFycmF5Iix0KSxlPUkoZSwwKSxwKG4pfHwobj1uZXcgTiksbi53ZXN0PXRbZSsrXSxuLnNvdXRoPXRbZSsrXSxuLmVhc3Q9dFtlKytdLG4ubm9ydGg9dFtlXSxufSxOLmNvbXB1dGVXaWR0aD1mdW5jdGlvbih0KXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7bGV0IGU9dC5lYXN0O2NvbnN0IG49dC53ZXN0O3JldHVybiBlPG4mJihlKz1SLlRXT19QSSksZS1ufSxOLmNvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx0Lm5vcnRoLXQuc291dGh9LE4uZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdD1SLnRvUmFkaWFucyhJKHQsMCkpLGU9Ui50b1JhZGlhbnMoSShlLDApKSxuPVIudG9SYWRpYW5zKEkobiwwKSkscj1SLnRvUmFkaWFucyhJKHIsMCkpLHAoaSk/KGkud2VzdD10LGkuc291dGg9ZSxpLmVhc3Q9bixpLm5vcnRoPXIsaSk6bmV3IE4odCxlLG4scil9LE4uZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gcChpKT8oaS53ZXN0PUkodCwwKSxpLnNvdXRoPUkoZSwwKSxpLmVhc3Q9SShuLDApLGkubm9ydGg9SShyLDApLGkpOm5ldyBOKHQsZSxuLHIpfSxOLmZyb21DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsdCk7bGV0IG49TnVtYmVyLk1BWF9WQUxVRSxyPS1OdW1iZXIuTUFYX1ZBTFVFLGk9TnVtYmVyLk1BWF9WQUxVRSxvPS1OdW1iZXIuTUFYX1ZBTFVFLHM9TnVtYmVyLk1BWF9WQUxVRSxoPS1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgYT0wLGY9dC5sZW5ndGg7YTxmO2ErKyl7Y29uc3QgZD10W2FdO249TWF0aC5taW4obixkLmxvbmdpdHVkZSkscj1NYXRoLm1heChyLGQubG9uZ2l0dWRlKSxzPU1hdGgubWluKHMsZC5sYXRpdHVkZSksaD1NYXRoLm1heChoLGQubGF0aXR1ZGUpO2NvbnN0IF89ZC5sb25naXR1ZGU+PTA/ZC5sb25naXR1ZGU6ZC5sb25naXR1ZGUrUi5UV09fUEk7aT1NYXRoLm1pbihpLF8pLG89TWF0aC5tYXgobyxfKX1yZXR1cm4gci1uPm8taSYmKG49aSxyPW8scj5SLlBJJiYocj1yLVIuVFdPX1BJKSxuPlIuUEkmJihuPW4tUi5UV09fUEkpKSxwKGUpPyhlLndlc3Q9bixlLnNvdXRoPXMsZS5lYXN0PXIsZS5ub3J0aD1oLGUpOm5ldyBOKG4scyxyLGgpfSxOLmZyb21DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUsbil7dS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KSxlPUkoZSxqLldHUzg0KTtsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFLGk9LU51bWJlci5NQVhfVkFMVUUsbz1OdW1iZXIuTUFYX1ZBTFVFLHM9LU51bWJlci5NQVhfVkFMVUUsaD1OdW1iZXIuTUFYX1ZBTFVFLGE9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBmPTAsZD10Lmxlbmd0aDtmPGQ7ZisrKXtjb25zdCBfPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtmXSk7cj1NYXRoLm1pbihyLF8ubG9uZ2l0dWRlKSxpPU1hdGgubWF4KGksXy5sb25naXR1ZGUpLGg9TWF0aC5taW4oaCxfLmxhdGl0dWRlKSxhPU1hdGgubWF4KGEsXy5sYXRpdHVkZSk7Y29uc3QgUz1fLmxvbmdpdHVkZT49MD9fLmxvbmdpdHVkZTpfLmxvbmdpdHVkZStSLlRXT19QSTtvPU1hdGgubWluKG8sUykscz1NYXRoLm1heChzLFMpfXJldHVybiBpLXI+cy1vJiYocj1vLGk9cyxpPlIuUEkmJihpPWktUi5UV09fUEkpLHI+Ui5QSSYmKHI9ci1SLlRXT19QSSkpLHAobik/KG4ud2VzdD1yLG4uc291dGg9aCxuLmVhc3Q9aSxuLm5vcnRoPWEsbik6bmV3IE4ocixoLGksYSl9LE4uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihwKHQpKXJldHVybiBwKGUpPyhlLndlc3Q9dC53ZXN0LGUuc291dGg9dC5zb3V0aCxlLmVhc3Q9dC5lYXN0LGUubm9ydGg9dC5ub3J0aCxlKTpuZXcgTih0Lndlc3QsdC5zb3V0aCx0LmVhc3QsdC5ub3J0aCl9LE4uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49SShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0Lndlc3QtZS53ZXN0KTw9biYmTWF0aC5hYnModC5zb3V0aC1lLnNvdXRoKTw9biYmTWF0aC5hYnModC5lYXN0LWUuZWFzdCk8PW4mJk1hdGguYWJzKHQubm9ydGgtZS5ub3J0aCk8PW59LE4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBOLmNsb25lKHRoaXMsdCl9LE4ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gTi5lcXVhbHModGhpcyx0KX0sTi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQud2VzdD09PWUud2VzdCYmdC5zb3V0aD09PWUuc291dGgmJnQuZWFzdD09PWUuZWFzdCYmdC5ub3J0aD09PWUubm9ydGh9LE4ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gTi5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sTi52YWxpZGF0ZT1mdW5jdGlvbih0KXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7Y29uc3QgZT10Lm5vcnRoO3UudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJub3J0aCIsZSwtUi5QSV9PVkVSX1RXTyksdS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm5vcnRoIixlLFIuUElfT1ZFUl9UV08pO2NvbnN0IG49dC5zb3V0aDt1LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGgiLG4sLVIuUElfT1ZFUl9UV08pLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aCIsbixSLlBJX09WRVJfVFdPKTtjb25zdCByPXQud2VzdDt1LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygid2VzdCIsciwtTWF0aC5QSSksdS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3QiLHIsTWF0aC5QSSk7Y29uc3QgaT10LmVhc3Q7dS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3QiLGksLU1hdGguUEkpLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0IixpLE1hdGguUEkpfSxOLnNvdXRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyB6KHQud2VzdCx0LnNvdXRoKX0sTi5ub3J0aHdlc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQud2VzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgeih0Lndlc3QsdC5ub3J0aCl9LE4ubm9ydGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10Lm5vcnRoLGUuaGVpZ2h0PTAsZSk6bmV3IHoodC5lYXN0LHQubm9ydGgpfSxOLnNvdXRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyB6KHQuZWFzdCx0LnNvdXRoKX0sTi5jZW50ZXI9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7bGV0IG49dC5lYXN0O2NvbnN0IHI9dC53ZXN0O248ciYmKG4rPVIuVFdPX1BJKTtjb25zdCBpPVIubmVnYXRpdmVQaVRvUGkoKHIrbikqLjUpLG89KHQuc291dGgrdC5ub3J0aCkqLjU7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPWksZS5sYXRpdHVkZT1vLGUuaGVpZ2h0PTAsZSk6bmV3IHooaSxvKX0sTi5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx1LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtsZXQgcj10LmVhc3QsaT10Lndlc3Qsbz1lLmVhc3Qscz1lLndlc3Q7cjxpJiZvPjA/cis9Ui5UV09fUEk6bzxzJiZyPjAmJihvKz1SLlRXT19QSSkscjxpJiZzPDA/cys9Ui5UV09fUEk6bzxzJiZpPDAmJihpKz1SLlRXT19QSSk7Y29uc3QgaD1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KGkscykpLGE9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihyLG8pKTtpZigodC53ZXN0PHQuZWFzdHx8ZS53ZXN0PGUuZWFzdCkmJmE8PWgpcmV0dXJuO2NvbnN0IGY9TWF0aC5tYXgodC5zb3V0aCxlLnNvdXRoKSxkPU1hdGgubWluKHQubm9ydGgsZS5ub3J0aCk7aWYoIShmPj1kKSlyZXR1cm4gcChuKT8obi53ZXN0PWgsbi5zb3V0aD1mLG4uZWFzdD1hLG4ubm9ydGg9ZCxuKTpuZXcgTihoLGYsYSxkKX0sTi5zaW1wbGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx1LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtjb25zdCByPU1hdGgubWF4KHQud2VzdCxlLndlc3QpLGk9TWF0aC5tYXgodC5zb3V0aCxlLnNvdXRoKSxvPU1hdGgubWluKHQuZWFzdCxlLmVhc3QpLHM9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGk+PXN8fHI+PW8pKXJldHVybiBwKG4pPyhuLndlc3Q9cixuLnNvdXRoPWksbi5lYXN0PW8sbi5ub3J0aD1zLG4pOm5ldyBOKHIsaSxvLHMpfSxOLnVuaW9uPWZ1bmN0aW9uKHQsZSxuKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksdS50eXBlT2Yub2JqZWN0KCJvdGhlclJlY3RhbmdsZSIsZSkscChuKXx8KG49bmV3IE4pO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCBoPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5taW4oaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KHIsbykpO3JldHVybiBuLndlc3Q9aCxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5zb3V0aCksbi5lYXN0PWEsbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubm9ydGgpLG59LE4uZXhwYW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKSxwKG4pfHwobj1uZXcgTiksbi53ZXN0PU1hdGgubWluKHQud2VzdCxlLmxvbmdpdHVkZSksbi5zb3V0aD1NYXRoLm1pbih0LnNvdXRoLGUubGF0aXR1ZGUpLG4uZWFzdD1NYXRoLm1heCh0LmVhc3QsZS5sb25naXR1ZGUpLG4ubm9ydGg9TWF0aC5tYXgodC5ub3J0aCxlLmxhdGl0dWRlKSxufSxOLmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKTtsZXQgbj1lLmxvbmdpdHVkZTtjb25zdCByPWUubGF0aXR1ZGUsaT10Lndlc3Q7bGV0IG89dC5lYXN0O3JldHVybiBvPGkmJihvKz1SLlRXT19QSSxuPDAmJihuKz1SLlRXT19QSSkpLChuPml8fFIuZXF1YWxzRXBzaWxvbihuLGksUi5FUFNJTE9OMTQpKSYmKG48b3x8Ui5lcXVhbHNFcHNpbG9uKG4sbyxSLkVQU0lMT04xNCkpJiZyPj10LnNvdXRoJiZyPD10Lm5vcnRofTtjb25zdCBSbz1uZXcgejtOLnN1YnNhbXBsZT1mdW5jdGlvbih0LGUsbixyKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksZT1JKGUsai5XR1M4NCksbj1JKG4sMCkscChyKXx8KHI9W10pO2xldCBpPTA7Y29uc3Qgbz10Lm5vcnRoLHM9dC5zb3V0aCxoPXQuZWFzdCxhPXQud2VzdCxmPVJvO2YuaGVpZ2h0PW4sZi5sb25naXR1ZGU9YSxmLmxhdGl0dWRlPW8scltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubG9uZ2l0dWRlPWgscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubGF0aXR1ZGU9cyxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyssZi5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyssbzwwP2YubGF0aXR1ZGU9bzpzPjA/Zi5sYXRpdHVkZT1zOmYubGF0aXR1ZGU9MDtmb3IobGV0IGQ9MTtkPDg7KytkKWYubG9uZ2l0dWRlPS1NYXRoLlBJK2QqUi5QSV9PVkVSX1RXTyxOLmNvbnRhaW5zKHQsZikmJihyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyspO3JldHVybiBmLmxhdGl0dWRlPT09MCYmKGYubG9uZ2l0dWRlPWEscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubG9uZ2l0dWRlPWgscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrKSxyLmxlbmd0aD1pLHJ9LE4uc3Vic2VjdGlvbj1mdW5jdGlvbih0LGUsbixyLGksbyl7aWYodS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdExlcnAiLGUsMSksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInNvdXRoTGVycCIsbiwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygic291dGhMZXJwIixuLDEpLHUudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiZWFzdExlcnAiLHIsMSksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoTGVycCIsaSwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDEpLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSxyKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygic291dGhMZXJwIixuLGkpLHAobyl8fChvPW5ldyBOKSx0Lndlc3Q8PXQuZWFzdCl7Y29uc3QgaD10LmVhc3QtdC53ZXN0O28ud2VzdD10Lndlc3QrZSpoLG8uZWFzdD10Lndlc3QrcipofWVsc2V7Y29uc3QgaD1SLlRXT19QSSt0LmVhc3QtdC53ZXN0O28ud2VzdD1SLm5lZ2F0aXZlUGlUb1BpKHQud2VzdCtlKmgpLG8uZWFzdD1SLm5lZ2F0aXZlUGlUb1BpKHQud2VzdCtyKmgpfWNvbnN0IHM9dC5ub3J0aC10LnNvdXRoO3JldHVybiBvLnNvdXRoPXQuc291dGgrbipzLG8ubm9ydGg9dC5zb3V0aCtpKnMsZT09PTEmJihvLndlc3Q9dC5lYXN0KSxyPT09MSYmKG8uZWFzdD10LmVhc3QpLG49PT0xJiYoby5zb3V0aD10Lm5vcnRoKSxpPT09MSYmKG8ubm9ydGg9dC5ub3J0aCksb30sTi5NQVhfVkFMVUU9T2JqZWN0LmZyZWV6ZShuZXcgTigtTWF0aC5QSSwtUi5QSV9PVkVSX1RXTyxNYXRoLlBJLFIuUElfT1ZFUl9UV08pKTt2YXIgZ3I9T2JqZWN0LmZyZWV6ZSh7REVQVEhfQlVGRkVSX0JJVDoyNTYsU1RFTkNJTF9CVUZGRVJfQklUOjEwMjQsQ09MT1JfQlVGRkVSX0JJVDoxNjM4NCxQT0lOVFM6MCxMSU5FUzoxLExJTkVfTE9PUDoyLExJTkVfU1RSSVA6MyxUUklBTkdMRVM6NCxUUklBTkdMRV9TVFJJUDo1LFRSSUFOR0xFX0ZBTjo2LFpFUk86MCxPTkU6MSxTUkNfQ09MT1I6NzY4LE9ORV9NSU5VU19TUkNfQ09MT1I6NzY5LFNSQ19BTFBIQTo3NzAsT05FX01JTlVTX1NSQ19BTFBIQTo3NzEsRFNUX0FMUEhBOjc3MixPTkVfTUlOVVNfRFNUX0FMUEhBOjc3MyxEU1RfQ09MT1I6Nzc0LE9ORV9NSU5VU19EU1RfQ09MT1I6Nzc1LFNSQ19BTFBIQV9TQVRVUkFURTo3NzYsRlVOQ19BREQ6MzI3NzQsQkxFTkRfRVFVQVRJT046MzI3NzcsQkxFTkRfRVFVQVRJT05fUkdCOjMyNzc3LEJMRU5EX0VRVUFUSU9OX0FMUEhBOjM0ODc3LEZVTkNfU1VCVFJBQ1Q6MzI3NzgsRlVOQ19SRVZFUlNFX1NVQlRSQUNUOjMyNzc5LEJMRU5EX0RTVF9SR0I6MzI5NjgsQkxFTkRfU1JDX1JHQjozMjk2OSxCTEVORF9EU1RfQUxQSEE6MzI5NzAsQkxFTkRfU1JDX0FMUEhBOjMyOTcxLENPTlNUQU5UX0NPTE9SOjMyNzY5LE9ORV9NSU5VU19DT05TVEFOVF9DT0xPUjozMjc3MCxDT05TVEFOVF9BTFBIQTozMjc3MSxPTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6MzI3NzIsQkxFTkRfQ09MT1I6MzI3NzMsQVJSQVlfQlVGRkVSOjM0OTYyLEVMRU1FTlRfQVJSQVlfQlVGRkVSOjM0OTYzLEFSUkFZX0JVRkZFUl9CSU5ESU5HOjM0OTY0LEVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjUsU1RSRUFNX0RSQVc6MzUwNDAsU1RBVElDX0RSQVc6MzUwNDQsRFlOQU1JQ19EUkFXOjM1MDQ4LEJVRkZFUl9TSVpFOjM0NjYwLEJVRkZFUl9VU0FHRTozNDY2MSxDVVJSRU5UX1ZFUlRFWF9BVFRSSUI6MzQzNDIsRlJPTlQ6MTAyOCxCQUNLOjEwMjksRlJPTlRfQU5EX0JBQ0s6MTAzMixDVUxMX0ZBQ0U6Mjg4NCxCTEVORDozMDQyLERJVEhFUjozMDI0LFNURU5DSUxfVEVTVDoyOTYwLERFUFRIX1RFU1Q6MjkyOSxTQ0lTU09SX1RFU1Q6MzA4OSxQT0xZR09OX09GRlNFVF9GSUxMOjMyODIzLFNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTozMjkyNixTQU1QTEVfQ09WRVJBR0U6MzI5MjgsTk9fRVJST1I6MCxJTlZBTElEX0VOVU06MTI4MCxJTlZBTElEX1ZBTFVFOjEyODEsSU5WQUxJRF9PUEVSQVRJT046MTI4MixPVVRfT0ZfTUVNT1JZOjEyODUsQ1c6MjMwNCxDQ1c6MjMwNSxMSU5FX1dJRFRIOjI4NDksQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFOjMzOTAxLEFMSUFTRURfTElORV9XSURUSF9SQU5HRTozMzkwMixDVUxMX0ZBQ0VfTU9ERToyODg1LEZST05UX0ZBQ0U6Mjg4NixERVBUSF9SQU5HRToyOTI4LERFUFRIX1dSSVRFTUFTSzoyOTMwLERFUFRIX0NMRUFSX1ZBTFVFOjI5MzEsREVQVEhfRlVOQzoyOTMyLFNURU5DSUxfQ0xFQVJfVkFMVUU6Mjk2MSxTVEVOQ0lMX0ZVTkM6Mjk2MixTVEVOQ0lMX0ZBSUw6Mjk2NCxTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDoyOTY1LFNURU5DSUxfUEFTU19ERVBUSF9QQVNTOjI5NjYsU1RFTkNJTF9SRUY6Mjk2NyxTVEVOQ0lMX1ZBTFVFX01BU0s6Mjk2MyxTVEVOQ0lMX1dSSVRFTUFTSzoyOTY4LFNURU5DSUxfQkFDS19GVU5DOjM0ODE2LFNURU5DSUxfQkFDS19GQUlMOjM0ODE3LFNURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUw6MzQ4MTgsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUzozNDgxOSxTVEVOQ0lMX0JBQ0tfUkVGOjM2MDAzLFNURU5DSUxfQkFDS19WQUxVRV9NQVNLOjM2MDA0LFNURU5DSUxfQkFDS19XUklURU1BU0s6MzYwMDUsVklFV1BPUlQ6Mjk3OCxTQ0lTU09SX0JPWDozMDg4LENPTE9SX0NMRUFSX1ZBTFVFOjMxMDYsQ09MT1JfV1JJVEVNQVNLOjMxMDcsVU5QQUNLX0FMSUdOTUVOVDozMzE3LFBBQ0tfQUxJR05NRU5UOjMzMzMsTUFYX1RFWFRVUkVfU0laRTozMzc5LE1BWF9WSUVXUE9SVF9ESU1TOjMzODYsU1VCUElYRUxfQklUUzozNDA4LFJFRF9CSVRTOjM0MTAsR1JFRU5fQklUUzozNDExLEJMVUVfQklUUzozNDEyLEFMUEhBX0JJVFM6MzQxMyxERVBUSF9CSVRTOjM0MTQsU1RFTkNJTF9CSVRTOjM0MTUsUE9MWUdPTl9PRkZTRVRfVU5JVFM6MTA3NTIsUE9MWUdPTl9PRkZTRVRfRkFDVE9SOjMyODI0LFRFWFRVUkVfQklORElOR18yRDozMjg3MyxTQU1QTEVfQlVGRkVSUzozMjkzNixTQU1QTEVTOjMyOTM3LFNBTVBMRV9DT1ZFUkFHRV9WQUxVRTozMjkzOCxTQU1QTEVfQ09WRVJBR0VfSU5WRVJUOjMyOTM5LENPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOjM0NDY3LERPTlRfQ0FSRTo0MzUyLEZBU1RFU1Q6NDM1MyxOSUNFU1Q6NDM1NCxHRU5FUkFURV9NSVBNQVBfSElOVDozMzE3MCxCWVRFOjUxMjAsVU5TSUdORURfQllURTo1MTIxLFNIT1JUOjUxMjIsVU5TSUdORURfU0hPUlQ6NTEyMyxJTlQ6NTEyNCxVTlNJR05FRF9JTlQ6NTEyNSxGTE9BVDo1MTI2LERFUFRIX0NPTVBPTkVOVDo2NDAyLEFMUEhBOjY0MDYsUkdCOjY0MDcsUkdCQTo2NDA4LExVTUlOQU5DRTo2NDA5LExVTUlOQU5DRV9BTFBIQTo2NDEwLFVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6MzI4MTksVU5TSUdORURfU0hPUlRfNV81XzVfMTozMjgyMCxVTlNJR05FRF9TSE9SVF81XzZfNTozMzYzNSxGUkFHTUVOVF9TSEFERVI6MzU2MzIsVkVSVEVYX1NIQURFUjozNTYzMyxNQVhfVkVSVEVYX0FUVFJJQlM6MzQ5MjEsTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6MzYzNDcsTUFYX1ZBUllJTkdfVkVDVE9SUzozNjM0OCxNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MSxNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzU2NjAsTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzQ5MzAsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzozNjM0OSxTSEFERVJfVFlQRTozNTY2MyxERUxFVEVfU1RBVFVTOjM1NzEyLExJTktfU1RBVFVTOjM1NzE0LFZBTElEQVRFX1NUQVRVUzozNTcxNSxBVFRBQ0hFRF9TSEFERVJTOjM1NzE3LEFDVElWRV9VTklGT1JNUzozNTcxOCxBQ1RJVkVfQVRUUklCVVRFUzozNTcyMSxTSEFESU5HX0xBTkdVQUdFX1ZFUlNJT046MzU3MjQsQ1VSUkVOVF9QUk9HUkFNOjM1NzI1LE5FVkVSOjUxMixMRVNTOjUxMyxFUVVBTDo1MTQsTEVRVUFMOjUxNSxHUkVBVEVSOjUxNixOT1RFUVVBTDo1MTcsR0VRVUFMOjUxOCxBTFdBWVM6NTE5LEtFRVA6NzY4MCxSRVBMQUNFOjc2ODEsSU5DUjo3NjgyLERFQ1I6NzY4MyxJTlZFUlQ6NTM4NixJTkNSX1dSQVA6MzQwNTUsREVDUl9XUkFQOjM0MDU2LFZFTkRPUjo3OTM2LFJFTkRFUkVSOjc5MzcsVkVSU0lPTjo3OTM4LE5FQVJFU1Q6OTcyOCxMSU5FQVI6OTcyOSxORUFSRVNUX01JUE1BUF9ORUFSRVNUOjk5ODQsTElORUFSX01JUE1BUF9ORUFSRVNUOjk5ODUsTkVBUkVTVF9NSVBNQVBfTElORUFSOjk5ODYsTElORUFSX01JUE1BUF9MSU5FQVI6OTk4NyxURVhUVVJFX01BR19GSUxURVI6MTAyNDAsVEVYVFVSRV9NSU5fRklMVEVSOjEwMjQxLFRFWFRVUkVfV1JBUF9TOjEwMjQyLFRFWFRVUkVfV1JBUF9UOjEwMjQzLFRFWFRVUkVfMkQ6MzU1MyxURVhUVVJFOjU4OTAsVEVYVFVSRV9DVUJFX01BUDozNDA2NyxURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6MzQwNjgsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOjM0MDY5LFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDozNDA3MCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k6MzQwNzEsVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOjM0MDcyLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjozNDA3MyxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6MzQwNzQsTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRTozNDA3NixURVhUVVJFMDozMzk4NCxURVhUVVJFMTozMzk4NSxURVhUVVJFMjozMzk4NixURVhUVVJFMzozMzk4NyxURVhUVVJFNDozMzk4OCxURVhUVVJFNTozMzk4OSxURVhUVVJFNjozMzk5MCxURVhUVVJFNzozMzk5MSxURVhUVVJFODozMzk5MixURVhUVVJFOTozMzk5MyxURVhUVVJFMTA6MzM5OTQsVEVYVFVSRTExOjMzOTk1LFRFWFRVUkUxMjozMzk5NixURVhUVVJFMTM6MzM5OTcsVEVYVFVSRTE0OjMzOTk4LFRFWFRVUkUxNTozMzk5OSxURVhUVVJFMTY6MzRlMyxURVhUVVJFMTc6MzQwMDEsVEVYVFVSRTE4OjM0MDAyLFRFWFRVUkUxOTozNDAwMyxURVhUVVJFMjA6MzQwMDQsVEVYVFVSRTIxOjM0MDA1LFRFWFRVUkUyMjozNDAwNixURVhUVVJFMjM6MzQwMDcsVEVYVFVSRTI0OjM0MDA4LFRFWFRVUkUyNTozNDAwOSxURVhUVVJFMjY6MzQwMTAsVEVYVFVSRTI3OjM0MDExLFRFWFRVUkUyODozNDAxMixURVhUVVJFMjk6MzQwMTMsVEVYVFVSRTMwOjM0MDE0LFRFWFRVUkUzMTozNDAxNSxBQ1RJVkVfVEVYVFVSRTozNDAxNixSRVBFQVQ6MTA0OTcsQ0xBTVBfVE9fRURHRTozMzA3MSxNSVJST1JFRF9SRVBFQVQ6MzM2NDgsRkxPQVRfVkVDMjozNTY2NCxGTE9BVF9WRUMzOjM1NjY1LEZMT0FUX1ZFQzQ6MzU2NjYsSU5UX1ZFQzI6MzU2NjcsSU5UX1ZFQzM6MzU2NjgsSU5UX1ZFQzQ6MzU2NjksQk9PTDozNTY3MCxCT09MX1ZFQzI6MzU2NzEsQk9PTF9WRUMzOjM1NjcyLEJPT0xfVkVDNDozNTY3MyxGTE9BVF9NQVQyOjM1Njc0LEZMT0FUX01BVDM6MzU2NzUsRkxPQVRfTUFUNDozNTY3NixTQU1QTEVSXzJEOjM1Njc4LFNBTVBMRVJfQ1VCRTozNTY4MCxWRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQ6MzQzMzgsVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOjM0MzM5LFZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFOjM0MzQwLFZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRTozNDM0MSxWRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQ6MzQ5MjIsVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSOjM0MzczLFZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NzUsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOjM1NzM4LElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUOjM1NzM5LENPTVBJTEVfU1RBVFVTOjM1NzEzLExPV19GTE9BVDozNjMzNixNRURJVU1fRkxPQVQ6MzYzMzcsSElHSF9GTE9BVDozNjMzOCxMT1dfSU5UOjM2MzM5LE1FRElVTV9JTlQ6MzYzNDAsSElHSF9JTlQ6MzYzNDEsRlJBTUVCVUZGRVI6MzYxNjAsUkVOREVSQlVGRkVSOjM2MTYxLFJHQkE0OjMyODU0LFJHQjVfQTE6MzI4NTUsUkdCNTY1OjM2MTk0LERFUFRIX0NPTVBPTkVOVDE2OjMzMTg5LFNURU5DSUxfSU5ERVg6NjQwMSxTVEVOQ0lMX0lOREVYODozNjE2OCxERVBUSF9TVEVOQ0lMOjM0MDQxLFJFTkRFUkJVRkZFUl9XSURUSDozNjE2MixSRU5ERVJCVUZGRVJfSEVJR0hUOjM2MTYzLFJFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQ6MzYxNjQsUkVOREVSQlVGRkVSX1JFRF9TSVpFOjM2MTc2LFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFOjM2MTc3LFJFTkRFUkJVRkZFUl9CTFVFX1NJWkU6MzYxNzgsUkVOREVSQlVGRkVSX0FMUEhBX1NJWkU6MzYxNzksUkVOREVSQlVGRkVSX0RFUFRIX1NJWkU6MzYxODAsUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRTozNjE4MSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOjM2MDQ4LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUU6MzYwNDksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMOjM2MDUwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOjM2MDUxLENPTE9SX0FUVEFDSE1FTlQwOjM2MDY0LERFUFRIX0FUVEFDSE1FTlQ6MzYwOTYsU1RFTkNJTF9BVFRBQ0hNRU5UOjM2MTI4LERFUFRIX1NURU5DSUxfQVRUQUNITUVOVDozMzMwNixOT05FOjAsRlJBTUVCVUZGRVJfQ09NUExFVEU6MzYwNTMsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOjM2MDU0LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UOjM2MDU1LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUzozNjA1NyxGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDozNjA2MSxGUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFTkRFUkJVRkZFUl9CSU5ESU5HOjM2MDA3LE1BWF9SRU5ERVJCVUZGRVJfU0laRTozNDAyNCxJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjoxMjg2LFVOUEFDS19GTElQX1lfV0VCR0w6Mzc0NDAsVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOjM3NDQxLENPTlRFWFRfTE9TVF9XRUJHTDozNzQ0MixVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMOjM3NDQzLEJST1dTRVJfREVGQVVMVF9XRUJHTDozNzQ0NCxDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOjMzNzc2LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOjMzNzc3LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOjMzNzc4LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOjMzNzc5LENPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc6MzU4NDAsQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRzozNTg0MSxDT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzozNTg0MixDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzozNTg0MyxDT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfV0VCR0w6Mzc4MDgsQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDozNjE5NixDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STTozNjQ5MixIQUxGX0ZMT0FUX09FUzozNjE5MyxET1VCTEU6NTEzMCxSRUFEX0JVRkZFUjozMDc0LFVOUEFDS19ST1dfTEVOR1RIOjMzMTQsVU5QQUNLX1NLSVBfUk9XUzozMzE1LFVOUEFDS19TS0lQX1BJWEVMUzozMzE2LFBBQ0tfUk9XX0xFTkdUSDozMzMwLFBBQ0tfU0tJUF9ST1dTOjMzMzEsUEFDS19TS0lQX1BJWEVMUzozMzMyLENPTE9SOjYxNDQsREVQVEg6NjE0NSxTVEVOQ0lMOjYxNDYsUkVEOjY0MDMsUkdCODozMjg0OSxSR0JBODozMjg1NixSR0IxMF9BMjozMjg1NyxURVhUVVJFX0JJTkRJTkdfM0Q6MzI4NzQsVU5QQUNLX1NLSVBfSU1BR0VTOjMyODc3LFVOUEFDS19JTUFHRV9IRUlHSFQ6MzI4NzgsVEVYVFVSRV8zRDozMjg3OSxURVhUVVJFX1dSQVBfUjozMjg4MixNQVhfM0RfVEVYVFVSRV9TSVpFOjMyODgzLFVOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVjozMzY0MCxNQVhfRUxFTUVOVFNfVkVSVElDRVM6MzNlMyxNQVhfRUxFTUVOVFNfSU5ESUNFUzozMzAwMSxURVhUVVJFX01JTl9MT0Q6MzMwODIsVEVYVFVSRV9NQVhfTE9EOjMzMDgzLFRFWFRVUkVfQkFTRV9MRVZFTDozMzA4NCxURVhUVVJFX01BWF9MRVZFTDozMzA4NSxNSU46MzI3NzUsTUFYOjMyNzc2LERFUFRIX0NPTVBPTkVOVDI0OjMzMTkwLE1BWF9URVhUVVJFX0xPRF9CSUFTOjM0MDQ1LFRFWFRVUkVfQ09NUEFSRV9NT0RFOjM0ODkyLFRFWFRVUkVfQ09NUEFSRV9GVU5DOjM0ODkzLENVUlJFTlRfUVVFUlk6MzQ5MTcsUVVFUllfUkVTVUxUOjM0OTE4LFFVRVJZX1JFU1VMVF9BVkFJTEFCTEU6MzQ5MTksU1RSRUFNX1JFQUQ6MzUwNDEsU1RSRUFNX0NPUFk6MzUwNDIsU1RBVElDX1JFQUQ6MzUwNDUsU1RBVElDX0NPUFk6MzUwNDYsRFlOQU1JQ19SRUFEOjM1MDQ5LERZTkFNSUNfQ09QWTozNTA1MCxNQVhfRFJBV19CVUZGRVJTOjM0ODUyLERSQVdfQlVGRkVSMDozNDg1MyxEUkFXX0JVRkZFUjE6MzQ4NTQsRFJBV19CVUZGRVIyOjM0ODU1LERSQVdfQlVGRkVSMzozNDg1NixEUkFXX0JVRkZFUjQ6MzQ4NTcsRFJBV19CVUZGRVI1OjM0ODU4LERSQVdfQlVGRkVSNjozNDg1OSxEUkFXX0JVRkZFUjc6MzQ4NjAsRFJBV19CVUZGRVI4OjM0ODYxLERSQVdfQlVGRkVSOTozNDg2MixEUkFXX0JVRkZFUjEwOjM0ODYzLERSQVdfQlVGRkVSMTE6MzQ4NjQsRFJBV19CVUZGRVIxMjozNDg2NSxEUkFXX0JVRkZFUjEzOjM0ODY2LERSQVdfQlVGRkVSMTQ6MzQ4NjcsRFJBV19CVUZGRVIxNTozNDg2OCxNQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1NjU3LE1BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTOjM1NjU4LFNBTVBMRVJfM0Q6MzU2NzksU0FNUExFUl8yRF9TSEFET1c6MzU2ODIsRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVDozNTcyMyxQSVhFTF9QQUNLX0JVRkZFUjozNTA1MSxQSVhFTF9VTlBBQ0tfQlVGRkVSOjM1MDUyLFBJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTMsUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HOjM1MDU1LEZMT0FUX01BVDJ4MzozNTY4NSxGTE9BVF9NQVQyeDQ6MzU2ODYsRkxPQVRfTUFUM3gyOjM1Njg3LEZMT0FUX01BVDN4NDozNTY4OCxGTE9BVF9NQVQ0eDI6MzU2ODksRkxPQVRfTUFUNHgzOjM1NjkwLFNSR0I6MzU5MDQsU1JHQjg6MzU5MDUsU1JHQjhfQUxQSEE4OjM1OTA3LENPTVBBUkVfUkVGX1RPX1RFWFRVUkU6MzQ4OTQsUkdCQTMyRjozNDgzNixSR0IzMkY6MzQ4MzcsUkdCQTE2RjozNDg0MixSR0IxNkY6MzQ4NDMsVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSOjM1MDY5LE1BWF9BUlJBWV9URVhUVVJFX0xBWUVSUzozNTA3MSxNSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzYsTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUOjM1MDc3LE1BWF9WQVJZSU5HX0NPTVBPTkVOVFM6MzU2NTksVEVYVFVSRV8yRF9BUlJBWTozNTg2NixURVhUVVJFX0JJTkRJTkdfMkRfQVJSQVk6MzU4NjksUjExRl9HMTFGX0IxMEY6MzU4OTgsVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFVjozNTg5OSxSR0I5X0U1OjM1OTAxLFVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjozNTkwMixUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREU6MzU5NjcsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTOjM1OTY4LFRSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HUzozNTk3MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUOjM1OTcyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRTozNTk3MyxUUkFOU0ZPUk1fRkVFREJBQ0tfUFJJTUlUSVZFU19XUklUVEVOOjM1OTc2LFJBU1RFUklaRVJfRElTQ0FSRDozNTk3NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFM6MzU5NzgsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTOjM1OTc5LElOVEVSTEVBVkVEX0FUVFJJQlM6MzU5ODAsU0VQQVJBVEVfQVRUUklCUzozNTk4MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSOjM1OTgyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElORzozNTk4MyxSR0JBMzJVSTozNjIwOCxSR0IzMlVJOjM2MjA5LFJHQkExNlVJOjM2MjE0LFJHQjE2VUk6MzYyMTUsUkdCQThVSTozNjIyMCxSR0I4VUk6MzYyMjEsUkdCQTMySTozNjIyNixSR0IzMkk6MzYyMjcsUkdCQTE2STozNjIzMixSR0IxNkk6MzYyMzMsUkdCQThJOjM2MjM4LFJHQjhJOjM2MjM5LFJFRF9JTlRFR0VSOjM2MjQ0LFJHQl9JTlRFR0VSOjM2MjQ4LFJHQkFfSU5URUdFUjozNjI0OSxTQU1QTEVSXzJEX0FSUkFZOjM2Mjg5LFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XOjM2MjkyLFNBTVBMRVJfQ1VCRV9TSEFET1c6MzYyOTMsVU5TSUdORURfSU5UX1ZFQzI6MzYyOTQsVU5TSUdORURfSU5UX1ZFQzM6MzYyOTUsVU5TSUdORURfSU5UX1ZFQzQ6MzYyOTYsSU5UX1NBTVBMRVJfMkQ6MzYyOTgsSU5UX1NBTVBMRVJfM0Q6MzYyOTksSU5UX1NBTVBMRVJfQ1VCRTozNjMwMCxJTlRfU0FNUExFUl8yRF9BUlJBWTozNjMwMyxVTlNJR05FRF9JTlRfU0FNUExFUl8yRDozNjMwNixVTlNJR05FRF9JTlRfU0FNUExFUl8zRDozNjMwNyxVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFOjM2MzA4LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzExLERFUFRIX0NPTVBPTkVOVDMyRjozNjAxMixERVBUSDMyRl9TVEVOQ0lMODozNjAxMyxGTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVY6MzYyNjksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORzozMzI5NixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFOjMzMjk3LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkU6MzMyOTgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFOjMzMjk5LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFOjMzMzAwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRTozMzMwMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkU6MzMzMDIsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkU6MzMzMDMsRlJBTUVCVUZGRVJfREVGQVVMVDozMzMwNCxVTlNJR05FRF9JTlRfMjRfODozNDA0MixERVBUSDI0X1NURU5DSUw4OjM1MDU2LFVOU0lHTkVEX05PUk1BTElaRUQ6MzU4NjMsRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFQURfRlJBTUVCVUZGRVI6MzYwMDgsRFJBV19GUkFNRUJVRkZFUjozNjAwOSxSRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMTAsUkVOREVSQlVGRkVSX1NBTVBMRVM6MzYwMTEsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSOjM2MDUyLE1BWF9DT0xPUl9BVFRBQ0hNRU5UUzozNjA2MyxDT0xPUl9BVFRBQ0hNRU5UMTozNjA2NSxDT0xPUl9BVFRBQ0hNRU5UMjozNjA2NixDT0xPUl9BVFRBQ0hNRU5UMzozNjA2NyxDT0xPUl9BVFRBQ0hNRU5UNDozNjA2OCxDT0xPUl9BVFRBQ0hNRU5UNTozNjA2OSxDT0xPUl9BVFRBQ0hNRU5UNjozNjA3MCxDT0xPUl9BVFRBQ0hNRU5UNzozNjA3MSxDT0xPUl9BVFRBQ0hNRU5UODozNjA3MixDT0xPUl9BVFRBQ0hNRU5UOTozNjA3MyxDT0xPUl9BVFRBQ0hNRU5UMTA6MzYwNzQsQ09MT1JfQVRUQUNITUVOVDExOjM2MDc1LENPTE9SX0FUVEFDSE1FTlQxMjozNjA3NixDT0xPUl9BVFRBQ0hNRU5UMTM6MzYwNzcsQ09MT1JfQVRUQUNITUVOVDE0OjM2MDc4LENPTE9SX0FUVEFDSE1FTlQxNTozNjA3OSxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFOjM2MTgyLE1BWF9TQU1QTEVTOjM2MTgzLEhBTEZfRkxPQVQ6NTEzMSxSRzozMzMxOSxSR19JTlRFR0VSOjMzMzIwLFI4OjMzMzIxLFJHODozMzMyMyxSMTZGOjMzMzI1LFIzMkY6MzMzMjYsUkcxNkY6MzMzMjcsUkczMkY6MzMzMjgsUjhJOjMzMzI5LFI4VUk6MzMzMzAsUjE2STozMzMzMSxSMTZVSTozMzMzMixSMzJJOjMzMzMzLFIzMlVJOjMzMzM0LFJHOEk6MzMzMzUsUkc4VUk6MzMzMzYsUkcxNkk6MzMzMzcsUkcxNlVJOjMzMzM4LFJHMzJJOjMzMzM5LFJHMzJVSTozMzM0MCxWRVJURVhfQVJSQVlfQklORElORzozNDIyOSxSOF9TTk9STTozNjc1NixSRzhfU05PUk06MzY3NTcsUkdCOF9TTk9STTozNjc1OCxSR0JBOF9TTk9STTozNjc1OSxTSUdORURfTk9STUFMSVpFRDozNjc2NCxDT1BZX1JFQURfQlVGRkVSOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSOjM2NjYzLENPUFlfUkVBRF9CVUZGRVJfQklORElORzozNjY2MixDT1BZX1dSSVRFX0JVRkZFUl9CSU5ESU5HOjM2NjYzLFVOSUZPUk1fQlVGRkVSOjM1MzQ1LFVOSUZPUk1fQlVGRkVSX0JJTkRJTkc6MzUzNjgsVU5JRk9STV9CVUZGRVJfU1RBUlQ6MzUzNjksVU5JRk9STV9CVUZGRVJfU0laRTozNTM3MCxNQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTOjM1MzcxLE1BWF9GUkFHTUVOVF9VTklGT1JNX0JMT0NLUzozNTM3MyxNQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1M6MzUzNzQsTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTOjM1Mzc1LE1BWF9VTklGT1JNX0JMT0NLX1NJWkU6MzUzNzYsTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzUzNzcsTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3OSxVTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UOjM1MzgwLEFDVElWRV9VTklGT1JNX0JMT0NLUzozNTM4MixVTklGT1JNX1RZUEU6MzUzODMsVU5JRk9STV9TSVpFOjM1Mzg0LFVOSUZPUk1fQkxPQ0tfSU5ERVg6MzUzODYsVU5JRk9STV9PRkZTRVQ6MzUzODcsVU5JRk9STV9BUlJBWV9TVFJJREU6MzUzODgsVU5JRk9STV9NQVRSSVhfU1RSSURFOjM1Mzg5LFVOSUZPUk1fSVNfUk9XX01BSk9SOjM1MzkwLFVOSUZPUk1fQkxPQ0tfQklORElORzozNTM5MSxVTklGT1JNX0JMT0NLX0RBVEFfU0laRTozNTM5MixVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUzozNTM5NCxVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVM6MzUzOTUsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVI6MzUzOTYsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUjozNTM5OCxJTlZBTElEX0lOREVYOjQyOTQ5NjcyOTUsTUFYX1ZFUlRFWF9PVVRQVVRfQ09NUE9ORU5UUzozNzE1NCxNQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUzozNzE1NyxNQVhfU0VSVkVSX1dBSVRfVElNRU9VVDozNzEzNyxPQkpFQ1RfVFlQRTozNzEzOCxTWU5DX0NPTkRJVElPTjozNzEzOSxTWU5DX1NUQVRVUzozNzE0MCxTWU5DX0ZMQUdTOjM3MTQxLFNZTkNfRkVOQ0U6MzcxNDIsU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEU6MzcxNDMsVU5TSUdOQUxFRDozNzE0NCxTSUdOQUxFRDozNzE0NSxBTFJFQURZX1NJR05BTEVEOjM3MTQ2LFRJTUVPVVRfRVhQSVJFRDozNzE0NyxDT05ESVRJT05fU0FUSVNGSUVEOjM3MTQ4LFdBSVRfRkFJTEVEOjM3MTQ5LFNZTkNfRkxVU0hfQ09NTUFORFNfQklUOjEsVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SOjM1MDcwLEFOWV9TQU1QTEVTX1BBU1NFRDozNTg4NyxBTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFOjM2MjAyLFNBTVBMRVJfQklORElORzozNTA5NyxSR0IxMF9BMlVJOjM2OTc1LElOVF8yXzEwXzEwXzEwX1JFVjozNjI1NSxUUkFOU0ZPUk1fRkVFREJBQ0s6MzYzODYsVFJBTlNGT1JNX0ZFRURCQUNLX1BBVVNFRDozNjM4NyxUUkFOU0ZPUk1fRkVFREJBQ0tfQUNUSVZFOjM2Mzg4LFRSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HOjM2Mzg5LENPTVBSRVNTRURfUjExX0VBQzozNzQ4OCxDT01QUkVTU0VEX1NJR05FRF9SMTFfRUFDOjM3NDg5LENPTVBSRVNTRURfUkcxMV9FQUM6Mzc0OTAsQ09NUFJFU1NFRF9TSUdORURfUkcxMV9FQUM6Mzc0OTEsQ09NUFJFU1NFRF9SR0I4X0VUQzI6Mzc0OTIsQ09NUFJFU1NFRF9TUkdCOF9FVEMyOjM3NDkzLENPTVBSRVNTRURfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTQsQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTUsQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzozNzQ5NixDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQzozNzQ5NyxURVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQ6MzcxNjcsTUFYX0VMRU1FTlRfSU5ERVg6MzYyMDMsVEVYVFVSRV9JTU1VVEFCTEVfTEVWRUxTOjMzNTAzLE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDozNDA0N30pO2NvbnN0IHRuPXtDTE9DS1dJU0U6Z3IuQ1csQ09VTlRFUl9DTE9DS1dJU0U6Z3IuQ0NXfTt0bi52YWxpZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRuLkNMT0NLV0lTRXx8dD09PXRuLkNPVU5URVJfQ0xPQ0tXSVNFfTt2YXIgbW49T2JqZWN0LmZyZWV6ZSh0bik7ZnVuY3Rpb24geHQodCl7dGhpcy5fZWxsaXBzb2lkPUkodCxqLldHUzg0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc31PYmplY3QuZGVmaW5lUHJvcGVydGllcyh4dC5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19fSkseHQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gUi5QSV9PVkVSX1RXTy0yKk1hdGguYXRhbihNYXRoLmV4cCgtdCkpfSx4dC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlPWZ1bmN0aW9uKHQpe3Q+eHQuTWF4aW11bUxhdGl0dWRlP3Q9eHQuTWF4aW11bUxhdGl0dWRlOnQ8LXh0Lk1heGltdW1MYXRpdHVkZSYmKHQ9LXh0Lk1heGltdW1MYXRpdHVkZSk7Y29uc3QgZT1NYXRoLnNpbih0KTtyZXR1cm4gLjUqTWF0aC5sb2coKDErZSkvKDEtZSkpfSx4dC5NYXhpbXVtTGF0aXR1ZGU9eHQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZShNYXRoLlBJKSx4dC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxyPXQubG9uZ2l0dWRlKm4saT14dC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKHQubGF0aXR1ZGUpKm4sbz10LmhlaWdodDtyZXR1cm4gcChlKT8oZS54PXIsZS55PWksZS56PW8sZSk6bmV3IGwocixpLG8pfSx4dC5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoImNhcnRlc2lhbiBpcyByZXF1aXJlZCIpO2NvbnN0IG49dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMscj10LngqbixpPXh0Lm1lcmNhdG9yQW5nbGVUb0dlb2RldGljTGF0aXR1ZGUodC55Km4pLG89dC56O3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1yLGUubGF0aXR1ZGU9aSxlLmhlaWdodD1vLGUpOm5ldyB6KHIsaSxvKX07ZnVuY3Rpb24gS3QodCl7aWYodD1JKHQsSS5FTVBUWV9PQkpFQ1QpLHRoaXMuX2VsbGlwc29pZD1JKHQuZWxsaXBzb2lkLGouV0dTODQpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPUkodC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWCwxKSx0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWT1JKHQubnVtYmVyT2ZMZXZlbFplcm9UaWxlc1ksMSksdGhpcy5fcHJvamVjdGlvbj1uZXcgeHQodGhpcy5fZWxsaXBzb2lkKSxwKHQucmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpJiZwKHQucmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpKXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPXQucmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMsdGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycztlbHNle2NvbnN0IHI9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMqTWF0aC5QSTt0aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycz1uZXcgeCgtciwtciksdGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnM9bmV3IHgocixyKX1jb25zdCBlPXRoaXMuX3Byb2plY3Rpb24udW5wcm9qZWN0KHRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzKSxuPXRoaXMuX3Byb2plY3Rpb24udW5wcm9qZWN0KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzKTt0aGlzLl9yZWN0YW5nbGU9bmV3IE4oZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxuLmxvbmdpdHVkZSxuLmxhdGl0dWRlKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhLdC5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHJlY3RhbmdsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3RhbmdsZX19LHByb2plY3Rpb246e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9qZWN0aW9ufX19KSxLdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWDw8dH0sS3QucHJvdG90eXBlLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1k8PHR9LEt0LnByb3RvdHlwZS5yZWN0YW5nbGVUb05hdGl2ZVJlY3RhbmdsZT1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5fcHJvamVjdGlvbixyPW4ucHJvamVjdChOLnNvdXRod2VzdCh0KSksaT1uLnByb2plY3QoTi5ub3J0aGVhc3QodCkpO3JldHVybiBwKGUpPyhlLndlc3Q9ci54LGUuc291dGg9ci55LGUuZWFzdD1pLngsZS5ub3J0aD1pLnksZSk6bmV3IE4oci54LHIueSxpLngsaS55KX0sS3QucHJvdG90eXBlLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwobiksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChuKSxzPSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksaD10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54K3QqcyxhPXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrKHQrMSkqcyxmPSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLnkpL28sZD10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LWUqZixfPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktKGUrMSkqZjtyZXR1cm4gcChyKT8oci53ZXN0PWgsci5zb3V0aD1fLHIuZWFzdD1hLHIubm9ydGg9ZCxyKTpuZXcgTihoLF8sYSxkKX0sS3QucHJvdG90eXBlLnRpbGVYWVRvUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dGhpcy50aWxlWFlUb05hdGl2ZVJlY3RhbmdsZSh0LGUsbixyKSxvPXRoaXMuX3Byb2plY3Rpb24scz1vLnVucHJvamVjdChuZXcgeChpLndlc3QsaS5zb3V0aCkpLGg9by51bnByb2plY3QobmV3IHgoaS5lYXN0LGkubm9ydGgpKTtyZXR1cm4gaS53ZXN0PXMubG9uZ2l0dWRlLGkuc291dGg9cy5sYXRpdHVkZSxpLmVhc3Q9aC5sb25naXR1ZGUsaS5ub3J0aD1oLmxhdGl0dWRlLGl9LEt0LnByb3RvdHlwZS5wb3NpdGlvblRvVGlsZVhZPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCByPXRoaXMuX3JlY3RhbmdsZTtpZighTi5jb250YWlucyhyLHQpKXJldHVybjtjb25zdCBpPXRoaXMuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsKGUpLG89dGhpcy5nZXROdW1iZXJPZllUaWxlc0F0TGV2ZWwoZSksaD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueC10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54KS9pLGY9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxfPXRoaXMuX3Byb2plY3Rpb24ucHJvamVjdCh0KSxTPV8ueC10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54LE89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS1fLnk7bGV0IHc9Uy9ofDA7dz49aSYmKHc9aS0xKTtsZXQgYj1PL2Z8MDtyZXR1cm4gYj49byYmKGI9by0xKSxwKG4pPyhuLng9dyxuLnk9YixuKTpuZXcgeCh3LGIpfTtmdW5jdGlvbiBTbigpe3RoaXMubmFtZT12b2lkIDAsdGhpcy5kZXNjcmlwdGlvbj12b2lkIDAsdGhpcy5wb3NpdGlvbj12b2lkIDAsdGhpcy5kYXRhPXZvaWQgMCx0aGlzLmltYWdlcnlMYXllcj12b2lkIDB9U24ucHJvdG90eXBlLmNvbmZpZ3VyZU5hbWVGcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtsZXQgZT0xMCxuO2Zvcihjb25zdCByIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmdFtyXSl7Y29uc3QgaT1yLnRvTG93ZXJDYXNlKCk7ZT4xJiZpPT09Im5hbWUiPyhlPTEsbj1yKTplPjImJmk9PT0idGl0bGUiPyhlPTIsbj1yKTplPjMmJi9uYW1lL2kudGVzdChyKT8oZT0zLG49cik6ZT40JiYvdGl0bGUvaS50ZXN0KHIpJiYoZT00LG49cil9cChuKSYmKHRoaXMubmFtZT10W25dKX0sU24ucHJvdG90eXBlLmNvbmZpZ3VyZURlc2NyaXB0aW9uRnJvbVByb3BlcnRpZXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtsZXQgcj0nPHRhYmxlIGNsYXNzPSJjZXNpdW0taW5mb0JveC1kZWZhdWx0VGFibGUiPic7Zm9yKGNvbnN0IGkgaW4gbilpZihuLmhhc093blByb3BlcnR5KGkpKXtjb25zdCBvPW5baV07cChvKSYmKHR5cGVvZiBvPT0ib2JqZWN0Ij9yKz1gPHRyPjx0ZD4ke2l9PC90ZD48dGQ+JHtlKG8pfTwvdGQ+PC90cj5gOnIrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke299PC90ZD48L3RyPmApfXJldHVybiByKz0iPC90YWJsZT4iLHJ9dGhpcy5kZXNjcmlwdGlvbj1lKHQpfTt2YXIgZW49eGU7ZnVuY3Rpb24geGUodCxlKXt0aGlzLng9dCx0aGlzLnk9ZX14ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4ZSh0aGlzLngsdGhpcy55KX0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2FkZCh0KX0sc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1Yih0KX0sbXVsdEJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdEJ5UG9pbnQodCl9LGRpdkJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludCh0KX0sbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KHQpfSxkaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KHQpfSxyb3RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKHQpfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQodCxlKX0sbWF0TXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpfSx1bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpfSxwZXJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LG1hZzpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sZXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX0sZGlzdDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcih0KSl9LGRpc3RTcXI6ZnVuY3Rpb24odCl7dmFyIGU9dC54LXRoaXMueCxuPXQueS10aGlzLnk7cmV0dXJuIGUqZStuKm59LGFuZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LHRoaXMueCl9LGFuZ2xlVG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LXQueSx0aGlzLngtdC54KX0sYW5nbGVXaXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuZ2xlV2l0aFNlcCh0LngsdC55KX0sYW5nbGVXaXRoU2VwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy54KmUtdGhpcy55KnQsdGhpcy54KnQrdGhpcy55KmUpfSxfbWF0TXVsdDpmdW5jdGlvbih0KXt2YXIgZT10WzBdKnRoaXMueCt0WzFdKnRoaXMueSxuPXRbMl0qdGhpcy54K3RbM10qdGhpcy55O3JldHVybiB0aGlzLng9ZSx0aGlzLnk9bix0aGlzfSxfYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfSxfc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfSxfbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxfZGl2OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngvPXQsdGhpcy55Lz10LHRoaXN9LF9tdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc30sX2RpdkJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9LF91bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycDpmdW5jdGlvbigpe3ZhciB0PXRoaXMueTtyZXR1cm4gdGhpcy55PXRoaXMueCx0aGlzLng9LXQsdGhpc30sX3JvdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpLHI9ZSp0aGlzLngtbip0aGlzLnksaT1uKnRoaXMueCtlKnRoaXMueTtyZXR1cm4gdGhpcy54PXIsdGhpcy55PWksdGhpc30sX3JvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCksaT1lLngrbioodGhpcy54LWUueCktcioodGhpcy55LWUueSksbz1lLnkrcioodGhpcy54LWUueCkrbioodGhpcy55LWUueSk7cmV0dXJuIHRoaXMueD1pLHRoaXMueT1vLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LHhlLmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB4ZT90OkFycmF5LmlzQXJyYXkodCk/bmV3IHhlKHRbMF0sdFsxXSk6dH07dmFyIGJvPWVuLG1yPU9lO2Z1bmN0aW9uIE9lKHQsZSxuLHIsaSl7dGhpcy5wcm9wZXJ0aWVzPXt9LHRoaXMuZXh0ZW50PW4sdGhpcy50eXBlPTAsdGhpcy5fcGJmPXQsdGhpcy5fZ2VvbWV0cnk9LTEsdGhpcy5fa2V5cz1yLHRoaXMuX3ZhbHVlcz1pLHQucmVhZEZpZWxkcyhnbyx0aGlzLGUpfWZ1bmN0aW9uIGdvKHQsZSxuKXt0PT0xP2UuaWQ9bi5yZWFkVmFyaW50KCk6dD09Mj9tbyhuLGUpOnQ9PTM/ZS50eXBlPW4ucmVhZFZhcmludCgpOnQ9PTQmJihlLl9nZW9tZXRyeT1uLnBvcyl9ZnVuY3Rpb24gbW8odCxlKXtmb3IodmFyIG49dC5yZWFkVmFyaW50KCkrdC5wb3M7dC5wb3M8bjspe3ZhciByPWUuX2tleXNbdC5yZWFkVmFyaW50KCldLGk9ZS5fdmFsdWVzW3QucmVhZFZhcmludCgpXTtlLnByb3BlcnRpZXNbcl09aX19T2UudHlwZXM9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdLE9lLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPVtdLGg7dC5wb3M8ZTspe2lmKHI8PTApe3ZhciBhPXQucmVhZFZhcmludCgpO249YSY3LHI9YT4+M31pZihyLS0sbj09PTF8fG49PT0yKWkrPXQucmVhZFNWYXJpbnQoKSxvKz10LnJlYWRTVmFyaW50KCksbj09PTEmJihoJiZzLnB1c2goaCksaD1bXSksaC5wdXNoKG5ldyBibyhpLG8pKTtlbHNlIGlmKG49PT03KWgmJmgucHVzaChoWzBdLmNsb25lKCkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGNvbW1hbmQgIituKX1yZXR1cm4gaCYmcy5wdXNoKGgpLHN9LE9lLnByb3RvdHlwZS5iYm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGJmO3QucG9zPXRoaXMuX2dlb21ldHJ5O2Zvcih2YXIgZT10LnJlYWRWYXJpbnQoKSt0LnBvcyxuPTEscj0wLGk9MCxvPTAscz0xLzAsaD0tMS8wLGE9MS8wLGY9LTEvMDt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGQ9dC5yZWFkVmFyaW50KCk7bj1kJjcscj1kPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxpPHMmJihzPWkpLGk+aCYmKGg9aSksbzxhJiYoYT1vKSxvPmYmJihmPW8pO2Vsc2UgaWYobiE9PTcpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGNvbW1hbmQgIituKX1yZXR1cm5bcyxhLGgsZl19LE9lLnByb3RvdHlwZS50b0dlb0pTT049ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZXh0ZW50Kk1hdGgucG93KDIsbiksaT10aGlzLmV4dGVudCp0LG89dGhpcy5leHRlbnQqZSxzPXRoaXMubG9hZEdlb21ldHJ5KCksaD1PZS50eXBlc1t0aGlzLnR5cGVdLGEsZjtmdW5jdGlvbiBkKE8pe2Zvcih2YXIgdz0wO3c8Ty5sZW5ndGg7dysrKXt2YXIgYj1PW3ddLE09MTgwLShiLnkrbykqMzYwL3I7T1t3XT1bKGIueCtpKSozNjAvci0xODAsMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKE0qTWF0aC5QSS8xODApKS05MF19fXN3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgMTp2YXIgXz1bXTtmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKV9bYV09c1thXVswXTtzPV8sZChzKTticmVhaztjYXNlIDI6Zm9yKGE9MDthPHMubGVuZ3RoO2ErKylkKHNbYV0pO2JyZWFrO2Nhc2UgMzpmb3Iocz1TbyhzKSxhPTA7YTxzLmxlbmd0aDthKyspZm9yKGY9MDtmPHNbYV0ubGVuZ3RoO2YrKylkKHNbYV1bZl0pO2JyZWFrfXMubGVuZ3RoPT09MT9zPXNbMF06aD0iTXVsdGkiK2g7dmFyIFM9e3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOmgsY29vcmRpbmF0ZXM6c30scHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O3JldHVybiJpZCJpbiB0aGlzJiYoUy5pZD10aGlzLmlkKSxTfTtmdW5jdGlvbiBTbyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD0xKXJldHVyblt0XTtmb3IodmFyIG49W10scixpLG89MDtvPGU7bysrKXt2YXIgcz13byh0W29dKTtzIT09MCYmKGk9PT12b2lkIDAmJihpPXM8MCksaT09PXM8MD8ociYmbi5wdXNoKHIpLHI9W3Rbb11dKTpyLnB1c2godFtvXSkpfXJldHVybiByJiZuLnB1c2gociksbn1mdW5jdGlvbiB3byh0KXtmb3IodmFyIGU9MCxuPTAscj10Lmxlbmd0aCxpPXItMSxvLHM7bjxyO2k9bisrKW89dFtuXSxzPXRbaV0sZSs9KHMueC1vLngpKihvLnkrcy55KTtyZXR1cm4gZX12YXIgSW89bXIsQ289U3I7ZnVuY3Rpb24gU3IodCxlKXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPXQsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sdC5yZWFkRmllbGRzKE5vLHRoaXMsZSksdGhpcy5sZW5ndGg9dGhpcy5fZmVhdHVyZXMubGVuZ3RofWZ1bmN0aW9uIE5vKHQsZSxuKXt0PT09MTU/ZS52ZXJzaW9uPW4ucmVhZFZhcmludCgpOnQ9PT0xP2UubmFtZT1uLnJlYWRTdHJpbmcoKTp0PT09NT9lLmV4dGVudD1uLnJlYWRWYXJpbnQoKTp0PT09Mj9lLl9mZWF0dXJlcy5wdXNoKG4ucG9zKTp0PT09Mz9lLl9rZXlzLnB1c2gobi5yZWFkU3RyaW5nKCkpOnQ9PT00JiZlLl92YWx1ZXMucHVzaChNbyhuKSl9ZnVuY3Rpb24gTW8odCl7Zm9yKHZhciBlPW51bGwsbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9dC5yZWFkVmFyaW50KCk+PjM7ZT1yPT09MT90LnJlYWRTdHJpbmcoKTpyPT09Mj90LnJlYWRGbG9hdCgpOnI9PT0zP3QucmVhZERvdWJsZSgpOnI9PT00P3QucmVhZFZhcmludDY0KCk6cj09PTU/dC5yZWFkVmFyaW50KCk6cj09PTY/dC5yZWFkU1ZhcmludCgpOnI9PT03P3QucmVhZEJvb2xlYW4oKTpudWxsfXJldHVybiBlfVNyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5fcGJmLnBvcz10aGlzLl9mZWF0dXJlc1t0XTt2YXIgZT10aGlzLl9wYmYucmVhZFZhcmludCgpK3RoaXMuX3BiZi5wb3M7cmV0dXJuIG5ldyBJbyh0aGlzLl9wYmYsZSx0aGlzLmV4dGVudCx0aGlzLl9rZXlzLHRoaXMuX3ZhbHVlcyl9O3ZhciBGbz1DbyxMbz1QbztmdW5jdGlvbiBQbyh0LGUpe3RoaXMubGF5ZXJzPXQucmVhZEZpZWxkcyh2byx7fSxlKX1mdW5jdGlvbiB2byh0LGUsbil7aWYodD09PTMpe3ZhciByPW5ldyBGbyhuLG4ucmVhZFZhcmludCgpK24ucG9zKTtyLmxlbmd0aCYmKGVbci5uYW1lXT1yKX19dmFyIERvPUxvLFh0PW1yLHduPXt9Oy8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovd24ucmVhZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLHMsaD1pKjgtci0xLGE9KDE8PGgpLTEsZj1hPj4xLGQ9LTcsXz1uP2ktMTowLFM9bj8tMToxLE89dFtlK19dO2ZvcihfKz1TLG89TyYoMTw8LWQpLTEsTz4+PS1kLGQrPWg7ZD4wO289byoyNTYrdFtlK19dLF8rPVMsZC09OCk7Zm9yKHM9byYoMTw8LWQpLTEsbz4+PS1kLGQrPXI7ZD4wO3M9cyoyNTYrdFtlK19dLF8rPVMsZC09OCk7aWYobz09PTApbz0xLWY7ZWxzZXtpZihvPT09YSlyZXR1cm4gcz9OYU46KE8/LTE6MSkqKDEvMCk7cz1zK01hdGgucG93KDIsciksbz1vLWZ9cmV0dXJuKE8/LTE6MSkqcypNYXRoLnBvdygyLG8tcil9LHduLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgcyxoLGEsZj1vKjgtaS0xLGQ9KDE8PGYpLTEsXz1kPj4xLFM9aT09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxPPXI/MDpvLTEsdz1yPzE6LTEsYj1lPDB8fGU9PT0wJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGg9aXNOYU4oZSk/MTowLHM9ZCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSooYT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxhKj0yKSxzK18+PTE/ZSs9Uy9hOmUrPVMqTWF0aC5wb3coMiwxLV8pLGUqYT49MiYmKHMrKyxhLz0yKSxzK18+PWQ/KGg9MCxzPWQpOnMrXz49MT8oaD0oZSphLTEpKk1hdGgucG93KDIsaSkscz1zK18pOihoPWUqTWF0aC5wb3coMixfLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W24rT109aCYyNTUsTys9dyxoLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxoLGYrPWk7Zj4wO3RbbitPXT1zJjI1NSxPKz13LHMvPTI1NixmLT04KTt0W24rTy13XXw9YioxMjh9O3ZhciBCbz1rLG5uPXduO2Z1bmN0aW9uIGsodCl7dGhpcy5idWY9QXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0fHwwKSx0aGlzLnBvcz0wLHRoaXMudHlwZT0wLHRoaXMubGVuZ3RoPXRoaXMuYnVmLmxlbmd0aH1rLlZhcmludD0wLGsuRml4ZWQ2ND0xLGsuQnl0ZXM9MixrLkZpeGVkMzI9NTt2YXIgSW49KDE8PDE2KSooMTw8MTYpLHdyPTEvSW4sVW89MTIsSXI9dHlwZW9mIFRleHREZWNvZGVyPiJ1Ij9udWxsOm5ldyBUZXh0RGVjb2RlcigidXRmOCIpO2sucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGUsbil7Zm9yKG49bnx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8bjspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLGk9cj4+MyxvPXRoaXMucG9zO3RoaXMudHlwZT1yJjcsdChpLGUsdGhpcyksdGhpcy5wb3M9PT1vJiZ0aGlzLnNraXAocil9cmV0dXJuIGV9LHJlYWRNZXNzYWdlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEZpZWxkcyh0LGUsdGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MpfSxyZWFkRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PXJuKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZFNGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9TnIodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkRml4ZWQ2NDpmdW5jdGlvbigpe3ZhciB0PXJuKHRoaXMuYnVmLHRoaXMucG9zKStybih0aGlzLmJ1Zix0aGlzLnBvcys0KSpJbjtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFNGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9cm4odGhpcy5idWYsdGhpcy5wb3MpK05yKHRoaXMuYnVmLHRoaXMucG9zKzQpKkluO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkRmxvYXQ6ZnVuY3Rpb24oKXt2YXIgdD1ubi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDIzLDQpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkRG91YmxlOmZ1bmN0aW9uKCl7dmFyIHQ9bm4ucmVhZCh0aGlzLmJ1Zix0aGlzLnBvcywhMCw1Miw4KTtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFZhcmludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJ1ZixuLHI7cmV0dXJuIHI9ZVt0aGlzLnBvcysrXSxuPXImMTI3LHI8MTI4fHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDcscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDE0LHI8MTI4KXx8KHI9ZVt0aGlzLnBvcysrXSxufD0ociYxMjcpPDwyMSxyPDEyOCk/bjoocj1lW3RoaXMucG9zXSxufD0ociYxNSk8PDI4LGpvKG4sdCx0aGlzKSl9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMucG9zO3JldHVybiB0aGlzLnBvcz10LHQtZT49VW8mJklyP0pvKHRoaXMuYnVmLGUsdCk6UW8odGhpcy5idWYsZSx0KX0scmVhZEJ5dGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsZT10aGlzLmJ1Zi5zdWJhcnJheSh0aGlzLnBvcyx0KTtyZXR1cm4gdGhpcy5wb3M9dCxlfSxyZWFkUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFZhcmludChlKSk7dmFyIG49V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8bjspdC5wdXNoKHRoaXMucmVhZFZhcmludChlKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3JldHVybiB0fSxyZWFkUGFja2VkQm9vbGVhbjpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1rLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZsb2F0OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWREb3VibGU6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRml4ZWQzMjpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1rLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtyZXR1cm4gdH0sc2tpcDpmdW5jdGlvbih0KXt2YXIgZT10Jjc7aWYoZT09PWsuVmFyaW50KWZvcig7dGhpcy5idWZbdGhpcy5wb3MrK10+MTI3Oyk7ZWxzZSBpZihlPT09ay5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGU9PT1rLkZpeGVkMzIpdGhpcy5wb3MrPTQ7ZWxzZSBpZihlPT09ay5GaXhlZDY0KXRoaXMucG9zKz04O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmltcGxlbWVudGVkIHR5cGU6ICIrZSl9LHdyaXRlVGFnOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludCh0PDwzfGUpfSxyZWFsbG9jOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmxlbmd0aHx8MTY7ZTx0aGlzLnBvcyt0OyllKj0yO2lmKGUhPT10aGlzLmxlbmd0aCl7dmFyIG49bmV3IFVpbnQ4QXJyYXkoZSk7bi5zZXQodGhpcy5idWYpLHRoaXMuYnVmPW4sdGhpcy5sZW5ndGg9ZX19LGZpbmlzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aD10aGlzLnBvcyx0aGlzLnBvcz0wLHRoaXMuYnVmLnN1YmFycmF5KDAsdGhpcy5sZW5ndGgpfSx3cml0ZUZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLFJlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZVNGaXhlZDMyOmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSxSZSh0aGlzLmJ1Zix0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSxSZSh0aGlzLmJ1Zix0Ji0xLHRoaXMucG9zKSxSZSh0aGlzLmJ1ZixNYXRoLmZsb29yKHQqd3IpLHRoaXMucG9zKzQpLHRoaXMucG9zKz04fSx3cml0ZVNGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSxSZSh0aGlzLmJ1Zix0Ji0xLHRoaXMucG9zKSxSZSh0aGlzLmJ1ZixNYXRoLmZsb29yKHQqd3IpLHRoaXMucG9zKzQpLHRoaXMucG9zKz04fSx3cml0ZVZhcmludDpmdW5jdGlvbih0KXtpZih0PSt0fHwwLHQ+MjY4NDM1NDU1fHx0PDApe0dvKHQsdGhpcyk7cmV0dXJufXRoaXMucmVhbGxvYyg0KSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10JjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPSh0Pj4+PTcpJjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPSh0Pj4+PTcpJjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyNykpKX0sd3JpdGVTVmFyaW50OmZ1bmN0aW9uKHQpe3RoaXMud3JpdGVWYXJpbnQodDwwPy10KjItMTp0KjIpfSx3cml0ZUJvb2xlYW46ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludChCb29sZWFuKHQpKX0sd3JpdGVTdHJpbmc6ZnVuY3Rpb24odCl7dD1TdHJpbmcodCksdGhpcy5yZWFsbG9jKHQubGVuZ3RoKjQpLHRoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dGhpcy5wb3M9dHModGhpcy5idWYsdCx0aGlzLnBvcyk7dmFyIG49dGhpcy5wb3MtZTtuPj0xMjgmJkNyKGUsbix0aGlzKSx0aGlzLnBvcz1lLTEsdGhpcy53cml0ZVZhcmludChuKSx0aGlzLnBvcys9bn0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksbm4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCwyMyw0KSx0aGlzLnBvcys9NH0sd3JpdGVEb3VibGU6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLG5uLndyaXRlKHRoaXMuYnVmLHQsdGhpcy5wb3MsITAsNTIsOCksdGhpcy5wb3MrPTh9LHdyaXRlQnl0ZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7dGhpcy53cml0ZVZhcmludChlKSx0aGlzLnJlYWxsb2MoZSk7Zm9yKHZhciBuPTA7bjxlO24rKyl0aGlzLmJ1Zlt0aGlzLnBvcysrXT10W25dfSx3cml0ZVJhd01lc3NhZ2U6ZnVuY3Rpb24odCxlKXt0aGlzLnBvcysrO3ZhciBuPXRoaXMucG9zO3QoZSx0aGlzKTt2YXIgcj10aGlzLnBvcy1uO3I+PTEyOCYmQ3IobixyLHRoaXMpLHRoaXMucG9zPW4tMSx0aGlzLndyaXRlVmFyaW50KHIpLHRoaXMucG9zKz1yfSx3cml0ZU1lc3NhZ2U6ZnVuY3Rpb24odCxlLG4pe3RoaXMud3JpdGVUYWcodCxrLkJ5dGVzKSx0aGlzLndyaXRlUmF3TWVzc2FnZShlLG4pfSx3cml0ZVBhY2tlZFZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LFZvLGUpfSx3cml0ZVBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxYbyxlKX0sd3JpdGVQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSG8sZSl9LHdyaXRlUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxXbyxlKX0sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCx6byxlKX0sd3JpdGVQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQscW8sZSl9LHdyaXRlUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxLbyxlKX0sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsWW8sZSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxabyxlKX0sd3JpdGVCeXRlc0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhlKX0sd3JpdGVGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDMyKSx0aGlzLndyaXRlRml4ZWQzMihlKX0sd3JpdGVTRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuRml4ZWQzMiksdGhpcy53cml0ZVNGaXhlZDMyKGUpfSx3cml0ZUZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxrLkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGUpfSx3cml0ZVNGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDY0KSx0aGlzLndyaXRlU0ZpeGVkNjQoZSl9LHdyaXRlVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5WYXJpbnQpLHRoaXMud3JpdGVWYXJpbnQoZSl9LHdyaXRlU1ZhcmludEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChlKX0sd3JpdGVTdHJpbmdGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxrLkJ5dGVzKSx0aGlzLndyaXRlU3RyaW5nKGUpfSx3cml0ZUZsb2F0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDMyKSx0aGlzLndyaXRlRmxvYXQoZSl9LHdyaXRlRG91YmxlRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGUpfSx3cml0ZUJvb2xlYW5GaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVWYXJpbnRGaWVsZCh0LEJvb2xlYW4oZSkpfX07ZnVuY3Rpb24gam8odCxlLG4pe3ZhciByPW4uYnVmLGksbztpZihvPXJbbi5wb3MrK10saT0obyYxMTIpPj40LG88MTI4fHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDMsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDEwLG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwxNyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MjQsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEpPDwzMSxvPDEyOCkpcmV0dXJuIFRlKHQsaSxlKTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzIil9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIHQudHlwZT09PWsuQnl0ZXM/dC5yZWFkVmFyaW50KCkrdC5wb3M6dC5wb3MrMX1mdW5jdGlvbiBUZSh0LGUsbil7cmV0dXJuIG4/ZSo0Mjk0OTY3Mjk2Kyh0Pj4+MCk6KGU+Pj4wKSo0Mjk0OTY3Mjk2Kyh0Pj4+MCl9ZnVuY3Rpb24gR28odCxlKXt2YXIgbixyO2lmKHQ+PTA/KG49dCU0Mjk0OTY3Mjk2fDAscj10LzQyOTQ5NjcyOTZ8MCk6KG49figtdCU0Mjk0OTY3Mjk2KSxyPX4oLXQvNDI5NDk2NzI5Niksbl40Mjk0OTY3Mjk1P249bisxfDA6KG49MCxyPXIrMXwwKSksdD49MTg0NDY3NDQwNzM3MDk1NTJlM3x8dDwtMTg0NDY3NDQwNzM3MDk1NTJlMyl0aHJvdyBuZXcgRXJyb3IoIkdpdmVuIHZhcmludCBkb2Vzbid0IGZpdCBpbnRvIDEwIGJ5dGVzIik7ZS5yZWFsbG9jKDEwKSwkbyhuLHIsZSksa28ocixlKX1mdW5jdGlvbiAkbyh0LGUsbil7bi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvc109dCYxMjd9ZnVuY3Rpb24ga28odCxlKXt2YXIgbj0odCY3KTw8NDtlLmJ1ZltlLnBvcysrXXw9bnwoKHQ+Pj49Myk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyNykpKSkpfWZ1bmN0aW9uIENyKHQsZSxuKXt2YXIgcj1lPD0xNjM4Mz8xOmU8PTIwOTcxNTE/MjplPD0yNjg0MzU0NTU/MzpNYXRoLmZsb29yKE1hdGgubG9nKGUpLyhNYXRoLkxOMio3KSk7bi5yZWFsbG9jKHIpO2Zvcih2YXIgaT1uLnBvcy0xO2k+PXQ7aS0tKW4uYnVmW2krcl09bi5idWZbaV19ZnVuY3Rpb24gVm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlVmFyaW50KHRbbl0pfWZ1bmN0aW9uIFhvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNWYXJpbnQodFtuXSl9ZnVuY3Rpb24gV28odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRmxvYXQodFtuXSl9ZnVuY3Rpb24gem8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRG91YmxlKHRbbl0pfWZ1bmN0aW9uIEhvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUJvb2xlYW4odFtuXSl9ZnVuY3Rpb24gcW8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRml4ZWQzMih0W25dKX1mdW5jdGlvbiBLbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVTRml4ZWQzMih0W25dKX1mdW5jdGlvbiBZbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDY0KHRbbl0pfWZ1bmN0aW9uIFpvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDY0KHRbbl0pfWZ1bmN0aW9uIHJuKHQsZSl7cmV0dXJuKHRbZV18dFtlKzFdPDw4fHRbZSsyXTw8MTYpK3RbZSszXSoxNjc3NzIxNn1mdW5jdGlvbiBSZSh0LGUsbil7dFtuXT1lLHRbbisxXT1lPj4+OCx0W24rMl09ZT4+PjE2LHRbbiszXT1lPj4+MjR9ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrKHRbZSszXTw8MjQpfWZ1bmN0aW9uIFFvKHQsZSxuKXtmb3IodmFyIHI9IiIsaT1lO2k8bjspe3ZhciBvPXRbaV0scz1udWxsLGg9bz4yMzk/NDpvPjIyMz8zOm8+MTkxPzI6MTtpZihpK2g+bilicmVhazt2YXIgYSxmLGQ7aD09PTE/bzwxMjgmJihzPW8pOmg9PT0yPyhhPXRbaSsxXSwoYSYxOTIpPT09MTI4JiYocz0obyYzMSk8PDZ8YSY2MyxzPD0xMjcmJihzPW51bGwpKSk6aD09PTM/KGE9dFtpKzFdLGY9dFtpKzJdLChhJjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTJ8KGEmNjMpPDw2fGYmNjMsKHM8PTIwNDd8fHM+PTU1Mjk2JiZzPD01NzM0MykmJihzPW51bGwpKSk6aD09PTQmJihhPXRbaSsxXSxmPXRbaSsyXSxkPXRbaSszXSwoYSYxOTIpPT09MTI4JiYoZiYxOTIpPT09MTI4JiYoZCYxOTIpPT09MTI4JiYocz0obyYxNSk8PDE4fChhJjYzKTw8MTJ8KGYmNjMpPDw2fGQmNjMsKHM8PTY1NTM1fHxzPj0xMTE0MTEyKSYmKHM9bnVsbCkpKSxzPT09bnVsbD8ocz02NTUzMyxoPTEpOnM+NjU1MzUmJihzLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHM+Pj4xMCYxMDIzfDU1Mjk2KSxzPTU2MzIwfHMmMTAyMykscis9U3RyaW5nLmZyb21DaGFyQ29kZShzKSxpKz1ofXJldHVybiByfWZ1bmN0aW9uIEpvKHQsZSxuKXtyZXR1cm4gSXIuZGVjb2RlKHQuc3ViYXJyYXkoZSxuKSl9ZnVuY3Rpb24gdHModCxlLG4pe2Zvcih2YXIgcj0wLGksbztyPGUubGVuZ3RoO3IrKyl7aWYoaT1lLmNoYXJDb2RlQXQociksaT41NTI5NSYmaTw1NzM0NClpZihvKWlmKGk8NTYzMjApe3RbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89aTtjb250aW51ZX1lbHNlIGk9by01NTI5Njw8MTB8aS01NjMyMHw2NTUzNixvPW51bGw7ZWxzZXtpPjU2MzE5fHxyKzE9PT1lLmxlbmd0aD8odFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODkpOm89aTtjb250aW51ZX1lbHNlIG8mJih0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSxvPW51bGwpO2k8MTI4P3RbbisrXT1pOihpPDIwNDg/dFtuKytdPWk+PjZ8MTkyOihpPDY1NTM2P3RbbisrXT1pPj4xMnwyMjQ6KHRbbisrXT1pPj4xOHwyNDAsdFtuKytdPWk+PjEyJjYzfDEyOCksdFtuKytdPWk+PjYmNjN8MTI4KSx0W24rK109aSY2M3wxMjgpfXJldHVybiBufXZhciBlcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsTXI9ZXMsbnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixycz1Ncnx8bnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksanQ9cnMsaXM9anQuU3ltYm9sLEd0PWlzLEZyPU9iamVjdC5wcm90b3R5cGUsb3M9RnIuaGFzT3duUHJvcGVydHksc3M9RnIudG9TdHJpbmcsRGU9R3Q/R3QudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGFzKHQpe3ZhciBlPW9zLmNhbGwodCxEZSksbj10W0RlXTt0cnl7dFtEZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgaT1zcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0RlXT1uOmRlbGV0ZSB0W0RlXSksaX12YXIgaHM9T2JqZWN0LnByb3RvdHlwZSxjcz1ocy50b1N0cmluZztmdW5jdGlvbiB1cyh0KXtyZXR1cm4gY3MuY2FsbCh0KX12YXIgZnM9IltvYmplY3QgTnVsbF0iLGxzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLExyPUd0P0d0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBiZSh0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP2xzOmZzOkxyJiZMciBpbiBPYmplY3QodCk/YXModCk6dXModCl9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In12YXIgZHM9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gQ24odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sInx8Z2UodCkmJmJlKHQpPT1kc31mdW5jdGlvbiBFcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfXZhciBfcz1BcnJheS5pc0FycmF5LFl0PV9zLHBzPTEvMCxQcj1HdD9HdC5wcm90b3R5cGU6dm9pZCAwLHZyPVByP1ByLnRvU3RyaW5nOnZvaWQgMDtmdW5jdGlvbiBEcih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ7aWYoWXQodCkpcmV0dXJuIEVzKHQsRHIpKyIiO2lmKENuKHQpKXJldHVybiB2cj92ci5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tcHM/Ii0wIjplfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIHlzKHQpe3JldHVybiB0fXZhciBBcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIseHM9IltvYmplY3QgRnVuY3Rpb25dIixPcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gQnIodCl7aWYoIW9lKHQpKXJldHVybiExO3ZhciBlPWJlKHQpO3JldHVybiBlPT14c3x8ZT09T3N8fGU9PUFzfHxlPT1Uc312YXIgUnM9anRbIl9fY29yZS1qc19zaGFyZWRfXyJdLE5uPVJzLFVyPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhObiYmTm4ua2V5cyYmTm4ua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBicyh0KXtyZXR1cm4hIVVyJiZVciBpbiB0fXZhciBncz1GdW5jdGlvbi5wcm90b3R5cGUsbXM9Z3MudG9TdHJpbmc7ZnVuY3Rpb24gc2UodCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBtcy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgU3M9L1tcXF4kLiorPygpW1xde318XS9nLHdzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLElzPUZ1bmN0aW9uLnByb3RvdHlwZSxDcz1PYmplY3QucHJvdG90eXBlLE5zPUlzLnRvU3RyaW5nLE1zPUNzLmhhc093blByb3BlcnR5LEZzPVJlZ0V4cCgiXiIrTnMuY2FsbChNcykucmVwbGFjZShTcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBMcyh0KXtpZighb2UodCl8fGJzKHQpKXJldHVybiExO3ZhciBlPUJyKHQpP0ZzOndzO3JldHVybiBlLnRlc3Qoc2UodCkpfWZ1bmN0aW9uIFBzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gYWUodCxlKXt2YXIgbj1Qcyh0LGUpO3JldHVybiBMcyhuKT9uOnZvaWQgMH12YXIgdnM9YWUoanQsIldlYWtNYXAiKSxNbj12cyxqcj1PYmplY3QuY3JlYXRlLERzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIW9lKGUpKXJldHVybnt9O2lmKGpyKXJldHVybiBqcihlKTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT12b2lkIDAsbn19KCksQnM9RHM7ZnVuY3Rpb24gVXModCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX1mdW5jdGlvbiBqcyh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGV8fChlPUFycmF5KHIpKTsrK248cjspZVtuXT10W25dO3JldHVybiBlfXZhciBHcz04MDAsJHM9MTYsa3M9RGF0ZS5ub3c7ZnVuY3Rpb24gVnModCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9a3MoKSxpPSRzLShyLW4pO2lmKG49cixpPjApe2lmKCsrZT49R3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gWHModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBXcz1mdW5jdGlvbigpe3RyeXt2YXIgdD1hZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxvbj1Xcyx6cz1vbj9mdW5jdGlvbih0LGUpe3JldHVybiBvbih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlhzKGUpLHdyaXRhYmxlOiEwfSl9OnlzLEhzPXpzLHFzPVZzKEhzKSxLcz1xcztmdW5jdGlvbiBZcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK248ciYmZSh0W25dLG4sdCkhPT0hMTspO3JldHVybiB0fXZhciBacz05MDA3MTk5MjU0NzQwOTkxLFFzPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBGbih0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiBlPWU/P1pzLCEhZSYmKG49PSJudW1iZXIifHxuIT0ic3ltYm9sIiYmUXMudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIEdyKHQsZSxuKXtlPT0iX19wcm90b19fIiYmb24/b24odCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufWZ1bmN0aW9uICRyKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT09dCYmZSE9PWV9dmFyIEpzPU9iamVjdC5wcm90b3R5cGUsdGE9SnMuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTG4odCxlLG4pe3ZhciByPXRbZV07KCEodGEuY2FsbCh0LGUpJiYkcihyLG4pKXx8bj09PXZvaWQgMCYmIShlIGluIHQpKSYmR3IodCxlLG4pfWZ1bmN0aW9uIHNuKHQsZSxuLHIpe3ZhciBpPSFuO258fChuPXt9KTtmb3IodmFyIG89LTEscz1lLmxlbmd0aDsrK288czspe3ZhciBoPWVbb10sYT1yP3IobltoXSx0W2hdLGgsbix0KTp2b2lkIDA7YT09PXZvaWQgMCYmKGE9dFtoXSksaT9HcihuLGgsYSk6TG4obixoLGEpfXJldHVybiBufXZhciBrcj1NYXRoLm1heDtmdW5jdGlvbiBlYSh0LGUsbil7cmV0dXJuIGU9a3IoZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLGk9LTEsbz1rcihyLmxlbmd0aC1lLDApLHM9QXJyYXkobyk7KytpPG87KXNbaV09cltlK2ldO2k9LTE7Zm9yKHZhciBoPUFycmF5KGUrMSk7KytpPGU7KWhbaV09cltpXTtyZXR1cm4gaFtlXT1uKHMpLFVzKHQsdGhpcyxoKX19dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gUG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiBWcih0KXtyZXR1cm4gdCE9bnVsbCYmUG4odC5sZW5ndGgpJiYhQnIodCl9dmFyIHJhPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gdm4odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcixuPXR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnByb3RvdHlwZXx8cmE7cmV0dXJuIHQ9PT1ufWZ1bmN0aW9uIGlhKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn12YXIgb2E9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gWHIodCl7cmV0dXJuIGdlKHQpJiZiZSh0KT09b2F9dmFyIFdyPU9iamVjdC5wcm90b3R5cGUsc2E9V3IuaGFzT3duUHJvcGVydHksYWE9V3IucHJvcGVydHlJc0VudW1lcmFibGUsaGE9WHIoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9YcjpmdW5jdGlvbih0KXtyZXR1cm4gZ2UodCkmJnNhLmNhbGwodCwiY2FsbGVlIikmJiFhYS5jYWxsKHQsImNhbGxlZSIpfSxEbj1oYTtmdW5jdGlvbiBjYSgpe3JldHVybiExfXZhciB6cj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLEhyPXpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsdWE9SHImJkhyLmV4cG9ydHM9PT16cixxcj11YT9qdC5CdWZmZXI6dm9pZCAwLGZhPXFyP3FyLmlzQnVmZmVyOnZvaWQgMCxsYT1mYXx8Y2EsS3I9bGEsZGE9IltvYmplY3QgQXJndW1lbnRzXSIsRWE9IltvYmplY3QgQXJyYXldIixfYT0iW29iamVjdCBCb29sZWFuXSIscGE9IltvYmplY3QgRGF0ZV0iLHlhPSJbb2JqZWN0IEVycm9yXSIsQWE9IltvYmplY3QgRnVuY3Rpb25dIix4YT0iW29iamVjdCBNYXBdIixPYT0iW29iamVjdCBOdW1iZXJdIixUYT0iW29iamVjdCBPYmplY3RdIixSYT0iW29iamVjdCBSZWdFeHBdIixiYT0iW29iamVjdCBTZXRdIixnYT0iW29iamVjdCBTdHJpbmddIixtYT0iW29iamVjdCBXZWFrTWFwXSIsU2E9IltvYmplY3QgQXJyYXlCdWZmZXJdIix3YT0iW29iamVjdCBEYXRhVmlld10iLElhPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLENhPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLE5hPSJbb2JqZWN0IEludDhBcnJheV0iLE1hPSJbb2JqZWN0IEludDE2QXJyYXldIixGYT0iW29iamVjdCBJbnQzMkFycmF5XSIsTGE9IltvYmplY3QgVWludDhBcnJheV0iLFBhPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsdmE9IltvYmplY3QgVWludDE2QXJyYXldIixEYT0iW29iamVjdCBVaW50MzJBcnJheV0iLEo9e307SltJYV09SltDYV09SltOYV09SltNYV09SltGYV09SltMYV09SltQYV09Slt2YV09SltEYV09ITAsSltkYV09SltFYV09SltTYV09SltfYV09Slt3YV09SltwYV09Slt5YV09SltBYV09Slt4YV09SltPYV09SltUYV09SltSYV09SltiYV09SltnYV09SlttYV09ITE7ZnVuY3Rpb24gQmEodCl7cmV0dXJuIGdlKHQpJiZQbih0Lmxlbmd0aCkmJiEhSltiZSh0KV19ZnVuY3Rpb24gQm4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgWXI9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxCZT1ZciYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLFVhPUJlJiZCZS5leHBvcnRzPT09WXIsVW49VWEmJk1yLnByb2Nlc3MsamE9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9QmUmJkJlLnJlcXVpcmUmJkJlLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8VW4mJlVuLmJpbmRpbmcmJlVuLmJpbmRpbmcoInV0aWwiKX1jYXRjaHt9fSgpLG1lPWphLFpyPW1lJiZtZS5pc1R5cGVkQXJyYXksR2E9WnI/Qm4oWnIpOkJhLCRhPUdhLGthPU9iamVjdC5wcm90b3R5cGUsVmE9a2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUXIodCxlKXt2YXIgbj1ZdCh0KSxyPSFuJiZEbih0KSxpPSFuJiYhciYmS3IodCksbz0hbiYmIXImJiFpJiYkYSh0KSxzPW58fHJ8fGl8fG8saD1zP2lhKHQubGVuZ3RoLFN0cmluZyk6W10sYT1oLmxlbmd0aDtmb3IodmFyIGYgaW4gdCkoZXx8VmEuY2FsbCh0LGYpKSYmIShzJiYoZj09Imxlbmd0aCJ8fGkmJihmPT0ib2Zmc2V0Inx8Zj09InBhcmVudCIpfHxvJiYoZj09ImJ1ZmZlciJ8fGY9PSJieXRlTGVuZ3RoInx8Zj09ImJ5dGVPZmZzZXQiKXx8Rm4oZixhKSkpJiZoLnB1c2goZik7cmV0dXJuIGh9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fXZhciBYYT1KcihPYmplY3Qua2V5cyxPYmplY3QpLFdhPVhhLHphPU9iamVjdC5wcm90b3R5cGUsSGE9emEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcWEodCl7aWYoIXZuKHQpKXJldHVybiBXYSh0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKUhhLmNhbGwodCxuKSYmbiE9ImNvbnN0cnVjdG9yIiYmZS5wdXNoKG4pO3JldHVybiBlfWZ1bmN0aW9uIGpuKHQpe3JldHVybiBWcih0KT9Rcih0KTpxYSh0KX1mdW5jdGlvbiBLYSh0KXt2YXIgZT1bXTtpZih0IT1udWxsKWZvcih2YXIgbiBpbiBPYmplY3QodCkpZS5wdXNoKG4pO3JldHVybiBlfXZhciBZYT1PYmplY3QucHJvdG90eXBlLFphPVlhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFhKHQpe2lmKCFvZSh0KSlyZXR1cm4gS2EodCk7dmFyIGU9dm4odCksbj1bXTtmb3IodmFyIHIgaW4gdClyPT0iY29uc3RydWN0b3IiJiYoZXx8IVphLmNhbGwodCxyKSl8fG4ucHVzaChyKTtyZXR1cm4gbn1mdW5jdGlvbiBHbih0KXtyZXR1cm4gVnIodCk/UXIodCwhMCk6UWEodCl9dmFyIEphPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHRoPS9eXHcqJC87ZnVuY3Rpb24gZWgodCxlKXtpZihZdCh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4gbj09Im51bWJlciJ8fG49PSJzeW1ib2wifHxuPT0iYm9vbGVhbiJ8fHQ9PW51bGx8fENuKHQpPyEwOnRoLnRlc3QodCl8fCFKYS50ZXN0KHQpfHxlIT1udWxsJiZ0IGluIE9iamVjdChlKX12YXIgbmg9YWUoT2JqZWN0LCJjcmVhdGUiKSxVZT1uaDtmdW5jdGlvbiByaCgpe3RoaXMuX19kYXRhX189VWU/VWUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gaWgodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIG9oPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixzaD1PYmplY3QucHJvdG90eXBlLGFoPXNoLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGhoKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoVWUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1vaD92b2lkIDA6bn1yZXR1cm4gYWguY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBjaD1PYmplY3QucHJvdG90eXBlLHVoPWNoLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGZoKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFVlP2VbdF0hPT12b2lkIDA6dWguY2FsbChlLHQpfXZhciBsaD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZGgodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVVlJiZlPT09dm9pZCAwP2xoOmUsdGhpc31mdW5jdGlvbiBoZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1oZS5wcm90b3R5cGUuY2xlYXI9cmgsaGUucHJvdG90eXBlLmRlbGV0ZT1paCxoZS5wcm90b3R5cGUuZ2V0PWhoLGhlLnByb3RvdHlwZS5oYXM9ZmgsaGUucHJvdG90eXBlLnNldD1kaDtmdW5jdGlvbiBFaCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gYW4odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZigkcih0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciBfaD1BcnJheS5wcm90b3R5cGUscGg9X2guc3BsaWNlO2Z1bmN0aW9uIHloKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1hbihlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6cGguY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gQWgodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWFuKGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiB4aCh0KXtyZXR1cm4gYW4odGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBPaCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1hbihuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHp0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXp0LnByb3RvdHlwZS5jbGVhcj1FaCx6dC5wcm90b3R5cGUuZGVsZXRlPXloLHp0LnByb3RvdHlwZS5nZXQ9QWgsenQucHJvdG90eXBlLmhhcz14aCx6dC5wcm90b3R5cGUuc2V0PU9oO3ZhciBUaD1hZShqdCwiTWFwIiksamU9VGg7ZnVuY3Rpb24gUmgoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBoZSxtYXA6bmV3KGplfHx6dCksc3RyaW5nOm5ldyBoZX19ZnVuY3Rpb24gYmgodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaG4odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBiaChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGdoKHQpe3ZhciBlPWhuKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gbWgodCl7cmV0dXJuIGhuKHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIFNoKHQpe3JldHVybiBobih0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiB3aCh0LGUpe3ZhciBuPWhuKHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gWnQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WnQucHJvdG90eXBlLmNsZWFyPVJoLFp0LnByb3RvdHlwZS5kZWxldGU9Z2gsWnQucHJvdG90eXBlLmdldD1taCxadC5wcm90b3R5cGUuaGFzPVNoLFp0LnByb3RvdHlwZS5zZXQ9d2g7dmFyIEloPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiAkbih0LGUpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24ifHxlIT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEloKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gbi5jYWNoZT1uZXcoJG4uQ2FjaGV8fFp0KSxufSRuLkNhY2hlPVp0O3ZhciBDaD01MDA7ZnVuY3Rpb24gTmgodCl7dmFyIGU9JG4odCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09Q2gmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBNaD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxGaD0vXFwoXFwpPy9nLExoPU5oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoTWgsZnVuY3Rpb24obixyLGksbyl7ZS5wdXNoKGk/by5yZXBsYWNlKEZoLCIkMSIpOnJ8fG4pfSksZX0pLFBoPUxoO2Z1bmN0aW9uIHZoKHQpe3JldHVybiB0PT1udWxsPyIiOkRyKHQpfWZ1bmN0aW9uIGNuKHQsZSl7cmV0dXJuIFl0KHQpP3Q6ZWgodCxlKT9bdF06UGgodmgodCkpfXZhciBEaD0xLzA7ZnVuY3Rpb24ga24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxDbih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LURoPyItMCI6ZX1mdW5jdGlvbiBCaCh0LGUpe2U9Y24oZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W2tuKGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIFZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9dmFyIHRpPUd0P0d0LmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7ZnVuY3Rpb24gVWgodCl7cmV0dXJuIFl0KHQpfHxEbih0KXx8ISEodGkmJnQmJnRbdGldKX1mdW5jdGlvbiBlaSh0LGUsbixyLGkpe3ZhciBvPS0xLHM9dC5sZW5ndGg7Zm9yKG58fChuPVVoKSxpfHwoaT1bXSk7KytvPHM7KXt2YXIgaD10W29dO2U+MCYmbihoKT9lPjE/ZWkoaCxlLTEsbixyLGkpOlZuKGksaCk6cnx8KGlbaS5sZW5ndGhdPWgpfXJldHVybiBpfWZ1bmN0aW9uIGpoKHQpe3ZhciBlPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4gZT9laSh0LDEpOltdfWZ1bmN0aW9uIEdoKHQpe3JldHVybiBLcyhlYSh0LHZvaWQgMCxqaCksdCsiIil9dmFyICRoPUpyKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLG5pPSRoO2Z1bmN0aW9uIGtoKCl7dGhpcy5fX2RhdGFfXz1uZXcgenQsdGhpcy5zaXplPTB9ZnVuY3Rpb24gVmgodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59ZnVuY3Rpb24gWGgodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfWZ1bmN0aW9uIFdoKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX12YXIgemg9MjAwO2Z1bmN0aW9uIEhoKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgenQpe3ZhciByPW4uX19kYXRhX187aWYoIWplfHxyLmxlbmd0aDx6aC0xKXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgWnQocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfWZ1bmN0aW9uIFNlKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IHp0KHQpO3RoaXMuc2l6ZT1lLnNpemV9U2UucHJvdG90eXBlLmNsZWFyPWtoLFNlLnByb3RvdHlwZS5kZWxldGU9VmgsU2UucHJvdG90eXBlLmdldD1YaCxTZS5wcm90b3R5cGUuaGFzPVdoLFNlLnByb3RvdHlwZS5zZXQ9SGg7ZnVuY3Rpb24gcWgodCxlKXtyZXR1cm4gdCYmc24oZSxqbihlKSx0KX1mdW5jdGlvbiBLaCh0LGUpe3JldHVybiB0JiZzbihlLEduKGUpLHQpfXZhciByaT10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGlpPXJpJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsWWg9aWkmJmlpLmV4cG9ydHM9PT1yaSxvaT1ZaD9qdC5CdWZmZXI6dm9pZCAwLHNpPW9pP29pLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBaaCh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxyPXNpP3NpKG4pOm5ldyB0LmNvbnN0cnVjdG9yKG4pO3JldHVybiB0LmNvcHkocikscn1mdW5jdGlvbiBRaCh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl07ZShzLG4sdCkmJihvW2krK109cyl9cmV0dXJuIG99ZnVuY3Rpb24gYWkoKXtyZXR1cm5bXX12YXIgSmg9T2JqZWN0LnByb3RvdHlwZSx0Yz1KaC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGVjPWhpP2Z1bmN0aW9uKHQpe3JldHVybiB0PT1udWxsP1tdOih0PU9iamVjdCh0KSxRaChoaSh0KSxmdW5jdGlvbihlKXtyZXR1cm4gdGMuY2FsbCh0LGUpfSkpfTphaSxYbj1lYztmdW5jdGlvbiBuYyh0LGUpe3JldHVybiBzbih0LFhuKHQpLGUpfXZhciByYz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGljPXJjP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXTt0OylWbihlLFhuKHQpKSx0PW5pKHQpO3JldHVybiBlfTphaSxjaT1pYztmdW5jdGlvbiBvYyh0LGUpe3JldHVybiBzbih0LGNpKHQpLGUpfWZ1bmN0aW9uIHVpKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBZdCh0KT9yOlZuKHIsbih0KSl9ZnVuY3Rpb24gc2ModCl7cmV0dXJuIHVpKHQsam4sWG4pfWZ1bmN0aW9uIGFjKHQpe3JldHVybiB1aSh0LEduLGNpKX12YXIgaGM9YWUoanQsIkRhdGFWaWV3IiksV249aGMsY2M9YWUoanQsIlByb21pc2UiKSx6bj1jYyx1Yz1hZShqdCwiU2V0IiksSG49dWMsZmk9IltvYmplY3QgTWFwXSIsZmM9IltvYmplY3QgT2JqZWN0XSIsbGk9IltvYmplY3QgUHJvbWlzZV0iLGRpPSJbb2JqZWN0IFNldF0iLEVpPSJbb2JqZWN0IFdlYWtNYXBdIixfaT0iW29iamVjdCBEYXRhVmlld10iLGxjPXNlKFduKSxkYz1zZShqZSksRWM9c2Uoem4pLF9jPXNlKEhuKSxwYz1zZShNbiksY2U9YmU7KFduJiZjZShuZXcgV24obmV3IEFycmF5QnVmZmVyKDEpKSkhPV9pfHxqZSYmY2UobmV3IGplKSE9Zml8fHpuJiZjZSh6bi5yZXNvbHZlKCkpIT1saXx8SG4mJmNlKG5ldyBIbikhPWRpfHxNbiYmY2UobmV3IE1uKSE9RWkpJiYoY2U9ZnVuY3Rpb24odCl7dmFyIGU9YmUodCksbj1lPT1mYz90LmNvbnN0cnVjdG9yOnZvaWQgMCxyPW4/c2Uobik6IiI7aWYocilzd2l0Y2gocil7Y2FzZSBsYzpyZXR1cm4gX2k7Y2FzZSBkYzpyZXR1cm4gZmk7Y2FzZSBFYzpyZXR1cm4gbGk7Y2FzZSBfYzpyZXR1cm4gZGk7Y2FzZSBwYzpyZXR1cm4gRWl9cmV0dXJuIGV9KTt2YXIgcW49Y2UseWM9T2JqZWN0LnByb3RvdHlwZSxBYz15Yy5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB4Yyh0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiZ0eXBlb2YgdFswXT09InN0cmluZyImJkFjLmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59dmFyIE9jPWp0LlVpbnQ4QXJyYXkscGk9T2M7ZnVuY3Rpb24gS24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHBpKGUpLnNldChuZXcgcGkodCkpLGV9ZnVuY3Rpb24gVGModCxlKXt2YXIgbj1lP0tuKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX12YXIgUmM9L1x3KiQvO2Z1bmN0aW9uIGJjKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLFJjLmV4ZWModCkpO3JldHVybiBlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlfXZhciB5aT1HdD9HdC5wcm90b3R5cGU6dm9pZCAwLEFpPXlpP3lpLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIGdjKHQpe3JldHVybiBBaT9PYmplY3QoQWkuY2FsbCh0KSk6e319ZnVuY3Rpb24gbWModCxlKXt2YXIgbj1lP0tuKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBTYz0iW29iamVjdCBCb29sZWFuXSIsd2M9IltvYmplY3QgRGF0ZV0iLEljPSJbb2JqZWN0IE1hcF0iLENjPSJbb2JqZWN0IE51bWJlcl0iLE5jPSJbb2JqZWN0IFJlZ0V4cF0iLE1jPSJbb2JqZWN0IFNldF0iLEZjPSJbb2JqZWN0IFN0cmluZ10iLExjPSJbb2JqZWN0IFN5bWJvbF0iLFBjPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdmM9IltvYmplY3QgRGF0YVZpZXddIixEYz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixCYz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixVYz0iW29iamVjdCBJbnQ4QXJyYXldIixqYz0iW29iamVjdCBJbnQxNkFycmF5XSIsR2M9IltvYmplY3QgSW50MzJBcnJheV0iLCRjPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixrYz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFZjPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsWGM9IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBXYyh0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBQYzpyZXR1cm4gS24odCk7Y2FzZSBTYzpjYXNlIHdjOnJldHVybiBuZXcgcigrdCk7Y2FzZSB2YzpyZXR1cm4gVGModCxuKTtjYXNlIERjOmNhc2UgQmM6Y2FzZSBVYzpjYXNlIGpjOmNhc2UgR2M6Y2FzZSAkYzpjYXNlIGtjOmNhc2UgVmM6Y2FzZSBYYzpyZXR1cm4gbWModCxuKTtjYXNlIEljOnJldHVybiBuZXcgcjtjYXNlIENjOmNhc2UgRmM6cmV0dXJuIG5ldyByKHQpO2Nhc2UgTmM6cmV0dXJuIGJjKHQpO2Nhc2UgTWM6cmV0dXJuIG5ldyByO2Nhc2UgTGM6cmV0dXJuIGdjKHQpfX1mdW5jdGlvbiB6Yyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiF2bih0KT9CcyhuaSh0KSk6e319dmFyIEhjPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIHFjKHQpe3JldHVybiBnZSh0KSYmcW4odCk9PUhjfXZhciB4aT1tZSYmbWUuaXNNYXAsS2M9eGk/Qm4oeGkpOnFjLFljPUtjLFpjPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFFjKHQpe3JldHVybiBnZSh0KSYmcW4odCk9PVpjfXZhciBPaT1tZSYmbWUuaXNTZXQsSmM9T2k/Qm4oT2kpOlFjLHR1PUpjLGV1PTEsbnU9MixydT00LFRpPSJbb2JqZWN0IEFyZ3VtZW50c10iLGl1PSJbb2JqZWN0IEFycmF5XSIsb3U9IltvYmplY3QgQm9vbGVhbl0iLHN1PSJbb2JqZWN0IERhdGVdIixhdT0iW29iamVjdCBFcnJvcl0iLFJpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsaHU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixjdT0iW29iamVjdCBNYXBdIix1dT0iW29iamVjdCBOdW1iZXJdIixiaT0iW29iamVjdCBPYmplY3RdIixmdT0iW29iamVjdCBSZWdFeHBdIixsdT0iW29iamVjdCBTZXRdIixkdT0iW29iamVjdCBTdHJpbmddIixFdT0iW29iamVjdCBTeW1ib2xdIixfdT0iW29iamVjdCBXZWFrTWFwXSIscHU9IltvYmplY3QgQXJyYXlCdWZmZXJdIix5dT0iW29iamVjdCBEYXRhVmlld10iLEF1PSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHh1PSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLE91PSJbb2JqZWN0IEludDhBcnJheV0iLFR1PSJbb2JqZWN0IEludDE2QXJyYXldIixSdT0iW29iamVjdCBJbnQzMkFycmF5XSIsYnU9IltvYmplY3QgVWludDhBcnJheV0iLGd1PSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsbXU9IltvYmplY3QgVWludDE2QXJyYXldIixTdT0iW29iamVjdCBVaW50MzJBcnJheV0iLFo9e307WltUaV09WltpdV09WltwdV09Wlt5dV09WltvdV09WltzdV09WltBdV09Wlt4dV09WltPdV09WltUdV09WltSdV09WltjdV09Wlt1dV09WltiaV09WltmdV09WltsdV09WltkdV09WltFdV09WltidV09WltndV09WlttdV09WltTdV09ITAsWlthdV09WltSaV09WltfdV09ITE7ZnVuY3Rpb24gdW4odCxlLG4scixpLG8pe3ZhciBzLGg9ZSZldSxhPWUmbnUsZj1lJnJ1O2lmKG4mJihzPWk/bih0LHIsaSxvKTpuKHQpKSxzIT09dm9pZCAwKXJldHVybiBzO2lmKCFvZSh0KSlyZXR1cm4gdDt2YXIgZD1ZdCh0KTtpZihkKXtpZihzPXhjKHQpLCFoKXJldHVybiBqcyh0LHMpfWVsc2V7dmFyIF89cW4odCksUz1fPT1SaXx8Xz09aHU7aWYoS3IodCkpcmV0dXJuIFpoKHQsaCk7aWYoXz09Yml8fF89PVRpfHxTJiYhaSl7aWYocz1hfHxTP3t9OnpjKHQpLCFoKXJldHVybiBhP29jKHQsS2gocyx0KSk6bmModCxxaChzLHQpKX1lbHNle2lmKCFaW19dKXJldHVybiBpP3Q6e307cz1XYyh0LF8saCl9fW98fChvPW5ldyBTZSk7dmFyIE89by5nZXQodCk7aWYoTylyZXR1cm4gTztvLnNldCh0LHMpLHR1KHQpP3QuZm9yRWFjaChmdW5jdGlvbihNKXtzLmFkZCh1bihNLGUsbixNLHQsbykpfSk6WWModCkmJnQuZm9yRWFjaChmdW5jdGlvbihNLG0pe3Muc2V0KG0sdW4oTSxlLG4sbSx0LG8pKX0pO3ZhciB3PWY/YT9hYzpzYzphP0duOmpuLGI9ZD92b2lkIDA6dyh0KTtyZXR1cm4gWXMoYnx8dCxmdW5jdGlvbihNLG0pe2ImJihtPU0sTT10W21dKSxMbihzLG0sdW4oTSxlLG4sbSx0LG8pKX0pLHN9dmFyIHd1PTEsSXU9NDtmdW5jdGlvbiBDdSh0KXtyZXR1cm4gdW4odCx3dXxJdSl9ZnVuY3Rpb24gTnUodCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gTXUodCxlLG4pe2U9Y24oZSx0KTtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIHM9a24oZVtyXSk7aWYoIShvPXQhPW51bGwmJm4odCxzKSkpYnJlYWs7dD10W3NdfXJldHVybiBvfHwrK3IhPWk/bzooaT10PT1udWxsPzA6dC5sZW5ndGgsISFpJiZQbihpKSYmRm4ocyxpKSYmKFl0KHQpfHxEbih0KSkpfWZ1bmN0aW9uIEZ1KHQsZSl7cmV0dXJuIHQhPW51bGwmJk11KHQsZSxOdSl9ZnVuY3Rpb24gTHUodCxlLG4scil7aWYoIW9lKHQpKXJldHVybiB0O2U9Y24oZSx0KTtmb3IodmFyIGk9LTEsbz1lLmxlbmd0aCxzPW8tMSxoPXQ7aCE9bnVsbCYmKytpPG87KXt2YXIgYT1rbihlW2ldKSxmPW47aWYoYT09PSJfX3Byb3RvX18ifHxhPT09ImNvbnN0cnVjdG9yInx8YT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKGkhPXMpe3ZhciBkPWhbYV07Zj1yP3IoZCxhLGgpOnZvaWQgMCxmPT09dm9pZCAwJiYoZj1vZShkKT9kOkZuKGVbaSsxXSk/W106e30pfUxuKGgsYSxmKSxoPWhbYV19cmV0dXJuIHR9ZnVuY3Rpb24gUHUodCxlLG4pe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89e307KytyPGk7KXt2YXIgcz1lW3JdLGg9QmgodCxzKTtuKGgscykmJkx1KG8sY24ocyx0KSxoKX1yZXR1cm4gb31mdW5jdGlvbiB2dSh0LGUpe3JldHVybiBQdSh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gRnUodCxyKX0pfXZhciBEdT1HaChmdW5jdGlvbih0LGUpe3JldHVybiB0PT1udWxsP3t9OnZ1KHQsZSl9KSxCdT1EdTtmdW5jdGlvbiBVdSh0KXtyZXR1cm4gT2JqZWN0LmtleXModCl9ZnVuY3Rpb24gZHQodCxlKXtyZXR1cm4gdD8/ZX1jb25zdCBqdT1uZXcgZW4oMCwwKTtmdW5jdGlvbiBHdSh0LGUsbil7cmV0dXJuIHQubGVuZ3RoPT09MHx8dFswXS5sZW5ndGg9PT0wPyExOnRbMF1bMF0uZGlzdFNxcihlKTw9bioqMn1mdW5jdGlvbiAkdSh0LGUsbil7aWYodC5sZW5ndGg9PT0wKXJldHVybiExO2NvbnN0IHI9dFswXSxpPW4vMjtmb3IobGV0IG89MDtvPHIubGVuZ3RoLTE7bysrKXtjb25zdCBzPXJbb10saD1yW28rMV07aWYoa3UocyxoLGUsaSxqdSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24ga3UodCxlLG4scixpPW5ldyBlbigwLDApKXtjb25zdCBvPXQuZGlzdFNxcihlKTtpZihvPT09MClyZXR1cm4hMTtjb25zdCBzPSgobi54LXQueCkqKGUueC10LngpKyhuLnktdC55KSooZS55LXQueSkpL28saD1NYXRoLm1heCgwLE1hdGgubWluKDEscykpLGE9aTtyZXR1cm4gYS54PXQueCtoKihlLngtdC54KSxhLnk9dC55K2gqKGUueS10LnkpLG4uZGlzdFNxcihhKTw9cioqMn1jb25zdCBWdT10PT57bGV0IGU9MDtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10LmNoYXJDb2RlQXQobik7ZT0oZTw8NSktZStyLGUmPWV9cmV0dXJuIGUudG9TdHJpbmcoMTYpfSxYdT1VdSh7bWFya2VyOjEscG9seWxpbmU6MSxwb2x5Z29uOjEsZWxsaXBzb2lkOjEsZWxsaXBzZToxLG1vZGVsOjEsIjNkdGlsZXMiOjEsYm94OjEscGhvdG9vdmVybGF5OjEscmVzb3VyY2U6MSxyYXN0ZXI6MSxoZWF0TWFwOjEsZnJ1c3R1bToxLHRyYW5zaXRpb246MX0pO2xldCBXdT1jbGFzc3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19LHp1PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuanNlcD1lLHRoaXMucmVnaXN0ZXJlZD17fX1yZWdpc3RlciguLi5lKXtlLmZvckVhY2gobj0+e2lmKHR5cGVvZiBuIT0ib2JqZWN0Inx8IW4ubmFtZXx8IW4uaW5pdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgSlNFUCBwbHVnaW4gZm9ybWF0Iik7dGhpcy5yZWdpc3RlcmVkW24ubmFtZV18fChuLmluaXQodGhpcy5qc2VwKSx0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXT1uKX0pfX0sU3Q9Y2xhc3MgeXtzdGF0aWMgZ2V0IHZlcnNpb24oKXtyZXR1cm4iMS40LjAifXN0YXRpYyB0b1N0cmluZygpe3JldHVybiJKYXZhU2NyaXB0IEV4cHJlc3Npb24gUGFyc2VyIChKU0VQKSB2Iit5LnZlcnNpb259c3RhdGljIGFkZFVuYXJ5T3AoZSl7cmV0dXJuIHkubWF4X3Vub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLHkubWF4X3Vub3BfbGVuKSx5LnVuYXJ5X29wc1tlXT0xLHl9c3RhdGljIGFkZEJpbmFyeU9wKGUsbixyKXtyZXR1cm4geS5tYXhfYmlub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLHkubWF4X2Jpbm9wX2xlbikseS5iaW5hcnlfb3BzW2VdPW4scj95LnJpZ2h0X2Fzc29jaWF0aXZlLmFkZChlKTp5LnJpZ2h0X2Fzc29jaWF0aXZlLmRlbGV0ZShlKSx5fXN0YXRpYyBhZGRJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4geS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuYWRkKGUpLHl9c3RhdGljIGFkZExpdGVyYWwoZSxuKXtyZXR1cm4geS5saXRlcmFsc1tlXT1uLHl9c3RhdGljIHJlbW92ZVVuYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSB5LnVuYXJ5X29wc1tlXSxlLmxlbmd0aD09PXkubWF4X3Vub3BfbGVuJiYoeS5tYXhfdW5vcF9sZW49eS5nZXRNYXhLZXlMZW4oeS51bmFyeV9vcHMpKSx5fXN0YXRpYyByZW1vdmVBbGxVbmFyeU9wcygpe3JldHVybiB5LnVuYXJ5X29wcz17fSx5Lm1heF91bm9wX2xlbj0wLHl9c3RhdGljIHJlbW92ZUlkZW50aWZpZXJDaGFyKGUpe3JldHVybiB5LmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5kZWxldGUoZSkseX1zdGF0aWMgcmVtb3ZlQmluYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSB5LmJpbmFyeV9vcHNbZV0sZS5sZW5ndGg9PT15Lm1heF9iaW5vcF9sZW4mJih5Lm1heF9iaW5vcF9sZW49eS5nZXRNYXhLZXlMZW4oeS5iaW5hcnlfb3BzKSkseS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSkseX1zdGF0aWMgcmVtb3ZlQWxsQmluYXJ5T3BzKCl7cmV0dXJuIHkuYmluYXJ5X29wcz17fSx5Lm1heF9iaW5vcF9sZW49MCx5fXN0YXRpYyByZW1vdmVMaXRlcmFsKGUpe3JldHVybiBkZWxldGUgeS5saXRlcmFsc1tlXSx5fXN0YXRpYyByZW1vdmVBbGxMaXRlcmFscygpe3JldHVybiB5LmxpdGVyYWxzPXt9LHl9Z2V0IGNoYXIoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KX1nZXQgY29kZSgpe3JldHVybiB0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KX1jb25zdHJ1Y3RvcihlKXt0aGlzLmV4cHI9ZSx0aGlzLmluZGV4PTB9c3RhdGljIHBhcnNlKGUpe3JldHVybiBuZXcgeShlKS5wYXJzZSgpfXN0YXRpYyBnZXRNYXhLZXlMZW4oZSl7cmV0dXJuIE1hdGgubWF4KDAsLi4uT2JqZWN0LmtleXMoZSkubWFwKG49Pm4ubGVuZ3RoKSl9c3RhdGljIGlzRGVjaW1hbERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTd9c3RhdGljIGJpbmFyeVByZWNlZGVuY2UoZSl7cmV0dXJuIHkuYmluYXJ5X29wc1tlXXx8MH1zdGF0aWMgaXNJZGVudGlmaWVyU3RhcnQoZSl7cmV0dXJuIGU+PTY1JiZlPD05MHx8ZT49OTcmJmU8PTEyMnx8ZT49MTI4JiYheS5iaW5hcnlfb3BzW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldfHx5LmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5oYXMoU3RyaW5nLmZyb21DaGFyQ29kZShlKSl9c3RhdGljIGlzSWRlbnRpZmllclBhcnQoZSl7cmV0dXJuIHkuaXNJZGVudGlmaWVyU3RhcnQoZSl8fHkuaXNEZWNpbWFsRGlnaXQoZSl9dGhyb3dFcnJvcihlKXtjb25zdCBuPW5ldyBFcnJvcihlKyIgYXQgY2hhcmFjdGVyICIrdGhpcy5pbmRleCk7dGhyb3cgbi5pbmRleD10aGlzLmluZGV4LG4uZGVzY3JpcHRpb249ZSxufXJ1bkhvb2soZSxuKXtpZih5Lmhvb2tzW2VdKXtjb25zdCByPXtjb250ZXh0OnRoaXMsbm9kZTpufTtyZXR1cm4geS5ob29rcy5ydW4oZSxyKSxyLm5vZGV9cmV0dXJuIG59c2VhcmNoSG9vayhlKXtpZih5Lmhvb2tzW2VdKXtjb25zdCBuPXtjb250ZXh0OnRoaXN9O3JldHVybiB5Lmhvb2tzW2VdLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2FsbChuLmNvbnRleHQsbiksbi5ub2RlfSksbi5ub2RlfX1nb2JibGVTcGFjZXMoKXtsZXQgZT10aGlzLmNvZGU7Zm9yKDtlPT09eS5TUEFDRV9DT0RFfHxlPT09eS5UQUJfQ09ERXx8ZT09PXkuTEZfQ09ERXx8ZT09PXkuQ1JfQ09ERTspZT10aGlzLmV4cHIuY2hhckNvZGVBdCgrK3RoaXMuaW5kZXgpO3RoaXMucnVuSG9vaygiZ29iYmxlLXNwYWNlcyIpfXBhcnNlKCl7dGhpcy5ydW5Ib29rKCJiZWZvcmUtYWxsIik7Y29uc3QgZT10aGlzLmdvYmJsZUV4cHJlc3Npb25zKCksbj1lLmxlbmd0aD09PTE/ZVswXTp7dHlwZTp5LkNPTVBPVU5ELGJvZHk6ZX07cmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItYWxsIixuKX1nb2JibGVFeHByZXNzaW9ucyhlKXtsZXQgbj1bXSxyLGk7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KWlmKHI9dGhpcy5jb2RlLHI9PT15LlNFTUNPTF9DT0RFfHxyPT09eS5DT01NQV9DT0RFKXRoaXMuaW5kZXgrKztlbHNlIGlmKGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCkpbi5wdXNoKGkpO2Vsc2UgaWYodGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoKXtpZihyPT09ZSlicmVhazt0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgIicrdGhpcy5jaGFyKyciJyl9cmV0dXJuIG59Z29iYmxlRXhwcmVzc2lvbigpe2NvbnN0IGU9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtZXhwcmVzc2lvbiIpfHx0aGlzLmdvYmJsZUJpbmFyeUV4cHJlc3Npb24oKTtyZXR1cm4gdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLnJ1bkhvb2soImFmdGVyLWV4cHJlc3Npb24iLGUpfWdvYmJsZUJpbmFyeU9wKCl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgZT10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgseS5tYXhfYmlub3BfbGVuKSxuPWUubGVuZ3RoO2Zvcig7bj4wOyl7aWYoeS5iaW5hcnlfb3BzLmhhc093blByb3BlcnR5KGUpJiYoIXkuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlKXx8dGhpcy5pbmRleCtlLmxlbmd0aDx0aGlzLmV4cHIubGVuZ3RoJiYheS5pc0lkZW50aWZpZXJQYXJ0KHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrZS5sZW5ndGgpKSkpcmV0dXJuIHRoaXMuaW5kZXgrPW4sZTtlPWUuc3Vic3RyKDAsLS1uKX1yZXR1cm4hMX1nb2JibGVCaW5hcnlFeHByZXNzaW9uKCl7bGV0IGUsbixyLGksbyxzLGgsYSxmO2lmKHM9dGhpcy5nb2JibGVUb2tlbigpLCFzfHwobj10aGlzLmdvYmJsZUJpbmFyeU9wKCksIW4pKXJldHVybiBzO2ZvcihvPXt2YWx1ZTpuLHByZWM6eS5iaW5hcnlQcmVjZWRlbmNlKG4pLHJpZ2h0X2E6eS5yaWdodF9hc3NvY2lhdGl2ZS5oYXMobil9LGg9dGhpcy5nb2JibGVUb2tlbigpLGh8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK24pLGk9W3MsbyxoXTtuPXRoaXMuZ29iYmxlQmluYXJ5T3AoKTspe2lmKHI9eS5iaW5hcnlQcmVjZWRlbmNlKG4pLHI9PT0wKXt0aGlzLmluZGV4LT1uLmxlbmd0aDticmVha31vPXt2YWx1ZTpuLHByZWM6cixyaWdodF9hOnkucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSxmPW47Y29uc3QgZD1fPT5vLnJpZ2h0X2EmJl8ucmlnaHRfYT9yPl8ucHJlYzpyPD1fLnByZWM7Zm9yKDtpLmxlbmd0aD4yJiZkKGlbaS5sZW5ndGgtMl0pOyloPWkucG9wKCksbj1pLnBvcCgpLnZhbHVlLHM9aS5wb3AoKSxlPXt0eXBlOnkuQklOQVJZX0VYUCxvcGVyYXRvcjpuLGxlZnQ6cyxyaWdodDpofSxpLnB1c2goZSk7ZT10aGlzLmdvYmJsZVRva2VuKCksZXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIGFmdGVyICIrZiksaS5wdXNoKG8sZSl9Zm9yKGE9aS5sZW5ndGgtMSxlPWlbYV07YT4xOyllPXt0eXBlOnkuQklOQVJZX0VYUCxvcGVyYXRvcjppW2EtMV0udmFsdWUsbGVmdDppW2EtMl0scmlnaHQ6ZX0sYS09MjtyZXR1cm4gZX1nb2JibGVUb2tlbigpe2xldCBlLG4scixpO2lmKHRoaXMuZ29iYmxlU3BhY2VzKCksaT10aGlzLnNlYXJjaEhvb2soImdvYmJsZS10b2tlbiIpLGkpcmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpO2lmKGU9dGhpcy5jb2RlLHkuaXNEZWNpbWFsRGlnaXQoZSl8fGU9PT15LlBFUklPRF9DT0RFKXJldHVybiB0aGlzLmdvYmJsZU51bWVyaWNMaXRlcmFsKCk7aWYoZT09PXkuU1FVT1RFX0NPREV8fGU9PT15LkRRVU9URV9DT0RFKWk9dGhpcy5nb2JibGVTdHJpbmdMaXRlcmFsKCk7ZWxzZSBpZihlPT09eS5PQlJBQ0tfQ09ERSlpPXRoaXMuZ29iYmxlQXJyYXkoKTtlbHNle2ZvcihuPXRoaXMuZXhwci5zdWJzdHIodGhpcy5pbmRleCx5Lm1heF91bm9wX2xlbikscj1uLmxlbmd0aDtyPjA7KXtpZih5LnVuYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShuKSYmKCF5LmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrbi5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIXkuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K24ubGVuZ3RoKSkpKXt0aGlzLmluZGV4Kz1yO2NvbnN0IG89dGhpcy5nb2JibGVUb2tlbigpO3JldHVybiBvfHx0aGlzLnRocm93RXJyb3IoIm1pc3NpbmcgdW5hcnlPcCBhcmd1bWVudCIpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLHt0eXBlOnkuVU5BUllfRVhQLG9wZXJhdG9yOm4sYXJndW1lbnQ6byxwcmVmaXg6ITB9KX1uPW4uc3Vic3RyKDAsLS1yKX15LmlzSWRlbnRpZmllclN0YXJ0KGUpPyhpPXRoaXMuZ29iYmxlSWRlbnRpZmllcigpLHkubGl0ZXJhbHMuaGFzT3duUHJvcGVydHkoaS5uYW1lKT9pPXt0eXBlOnkuTElURVJBTCx2YWx1ZTp5LmxpdGVyYWxzW2kubmFtZV0scmF3OmkubmFtZX06aS5uYW1lPT09eS50aGlzX3N0ciYmKGk9e3R5cGU6eS5USElTX0VYUH0pKTplPT09eS5PUEFSRU5fQ09ERSYmKGk9dGhpcy5nb2JibGVHcm91cCgpKX1yZXR1cm4gaT8oaT10aGlzLmdvYmJsZVRva2VuUHJvcGVydHkoaSksdGhpcy5ydW5Ib29rKCJhZnRlci10b2tlbiIsaSkpOnRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLCExKX1nb2JibGVUb2tlblByb3BlcnR5KGUpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IG49dGhpcy5jb2RlO2Zvcig7bj09PXkuUEVSSU9EX0NPREV8fG49PT15Lk9CUkFDS19DT0RFfHxuPT09eS5PUEFSRU5fQ09ERXx8bj09PXkuUVVNQVJLX0NPREU7KXtsZXQgcjtpZihuPT09eS5RVU1BUktfQ09ERSl7aWYodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKSE9PXkuUEVSSU9EX0NPREUpYnJlYWs7cj0hMCx0aGlzLmluZGV4Kz0yLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9dGhpcy5pbmRleCsrLG49PT15Lk9CUkFDS19DT0RFPyhlPXt0eXBlOnkuTUVNQkVSX0VYUCxjb21wdXRlZDohMCxvYmplY3Q6ZSxwcm9wZXJ0eTp0aGlzLmdvYmJsZUV4cHJlc3Npb24oKX0sZS5wcm9wZXJ0eXx8dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PXkuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PXkuT1BBUkVOX0NPREU/ZT17dHlwZTp5LkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyh5LkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT15LlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6eS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDt5LmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT15LlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7eS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO3kuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO3kuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUseS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT15LlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PXkuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6eS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOnkuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2Zvcih5LmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLHkuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTp5LklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT15LkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09eS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PXkuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT15LkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT15LkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoeS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09eS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOnkuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTp5LkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyh5LkNCUkFDS19DT0RFKX19fTtjb25zdCBIdT1uZXcgV3U7T2JqZWN0LmFzc2lnbihTdCx7aG9va3M6SHUscGx1Z2luczpuZXcgenUoU3QpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiPz8iOjEsIiYmIjoyLCJ8IjozLCJeIjo0LCImIjo1LCI9PSI6NiwiIT0iOjYsIj09PSI6NiwiIT09Ijo2LCI8Ijo3LCI+Ijo3LCI8PSI6NywiPj0iOjcsIjw8Ijo4LCI+PiI6OCwiPj4+Ijo4LCIrIjo5LCItIjo5LCIqIjoxMCwiLyI6MTAsIiUiOjEwLCIqKiI6MTF9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQoWyIqKiJdKSxhZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnM6bmV3IFNldChbIiQiLCJfIl0pLGxpdGVyYWxzOnt0cnVlOiEwLGZhbHNlOiExLG51bGw6bnVsbH0sdGhpc19zdHI6InRoaXMifSksU3QubWF4X3Vub3BfbGVuPVN0LmdldE1heEtleUxlbihTdC51bmFyeV9vcHMpLFN0Lm1heF9iaW5vcF9sZW49U3QuZ2V0TWF4S2V5TGVuKFN0LmJpbmFyeV9vcHMpO2NvbnN0IFF0PXQ9Pm5ldyBTdCh0KS5wYXJzZSgpLHF1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNsYXNze30pO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN0KS5maWx0ZXIodD0+IXF1LmluY2x1ZGVzKHQpJiZRdFt0XT09PXZvaWQgMCkuZm9yRWFjaCh0PT57UXRbdF09U3RbdF19KSxRdC5Kc2VwPVN0O2NvbnN0IEt1PSJDb25kaXRpb25hbEV4cHJlc3Npb24iO3ZhciBZdT17bmFtZToidGVybmFyeSIsaW5pdCh0KXt0Lmhvb2tzLmFkZCgiYWZ0ZXItZXhwcmVzc2lvbiIsZnVuY3Rpb24obil7aWYobi5ub2RlJiZ0aGlzLmNvZGU9PT10LlFVTUFSS19DT0RFKXt0aGlzLmluZGV4Kys7Y29uc3Qgcj1uLm5vZGUsaT10aGlzLmdvYmJsZUV4cHJlc3Npb24oKTtpZihpfHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24iKSx0aGlzLmdvYmJsZVNwYWNlcygpLHRoaXMuY29kZT09PXQuQ09MT05fQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IG89dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYob3x8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksbi5ub2RlPXt0eXBlOkt1LHRlc3Q6cixjb25zZXF1ZW50OmksYWx0ZXJuYXRlOm99LHIub3BlcmF0b3ImJnQuYmluYXJ5X29wc1tyLm9wZXJhdG9yXTw9Ljkpe2xldCBzPXI7Zm9yKDtzLnJpZ2h0Lm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbcy5yaWdodC5vcGVyYXRvcl08PS45OylzPXMucmlnaHQ7bi5ub2RlLnRlc3Q9cy5yaWdodCxzLnJpZ2h0PW4ubm9kZSxuLm5vZGU9cn19ZWxzZSB0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIDoiKX19KX19O1F0LnBsdWdpbnMucmVnaXN0ZXIoWXUpO3ZhciBGPSh0PT4odFt0LlZBUklBQkxFPTBdPSJWQVJJQUJMRSIsdFt0LlVOQVJZPTFdPSJVTkFSWSIsdFt0LkJJTkFSWT0yXT0iQklOQVJZIix0W3QuVEVSTkFSWT0zXT0iVEVSTkFSWSIsdFt0LkNPTkRJVElPTkFMPTRdPSJDT05ESVRJT05BTCIsdFt0Lk1FTUJFUj01XT0iTUVNQkVSIix0W3QuRlVOQ1RJT05fQ0FMTD02XT0iRlVOQ1RJT05fQ0FMTCIsdFt0LkFSUkFZPTddPSJBUlJBWSIsdFt0LlJFR0VYPThdPSJSRUdFWCIsdFt0LlZBUklBQkxFX0lOX1NUUklORz05XT0iVkFSSUFCTEVfSU5fU1RSSU5HIix0W3QuTElURVJBTF9OVUxMPTEwXT0iTElURVJBTF9OVUxMIix0W3QuTElURVJBTF9CT09MRUFOPTExXT0iTElURVJBTF9CT09MRUFOIix0W3QuTElURVJBTF9OVU1CRVI9MTJdPSJMSVRFUkFMX05VTUJFUiIsdFt0LkxJVEVSQUxfU1RSSU5HPTEzXT0iTElURVJBTF9TVFJJTkciLHRbdC5MSVRFUkFMX0NPTE9SPTE0XT0iTElURVJBTF9DT0xPUiIsdFt0LkxJVEVSQUxfVkVDVE9SPTE1XT0iTElURVJBTF9WRUNUT1IiLHRbdC5MSVRFUkFMX1JFR0VYPTE2XT0iTElURVJBTF9SRUdFWCIsdFt0LkxJVEVSQUxfVU5ERUZJTkVEPTE3XT0iTElURVJBTF9VTkRFRklORUQiLHRbdC5CVUlMVElOX1ZBUklBQkxFPTE4XT0iQlVJTFRJTl9WQVJJQUJMRSIsdCkpKEZ8fHt9KTtjb25zdCBadT1bIiEiLCItIiwiKyJdLFF1PVsiKyIsIi0iLCIqIiwiLyIsIiUiLCI9PT0iLCIhPT0iLCI+IiwiPj0iLCI8IiwiPD0iLCImJiIsInx8IiwiIX4iLCI9fiIsIj09IiwiIT0iXSxKdT0vXFwvZyx0Zj0iQCMlIixlZj0vQCMlL2csbmY9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKT8kL2kscmY9L14jKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KT8kL2ksZ2k9e0FMSUNFQkxVRToiI0YwRjhGRiIsQU5USVFVRVdISVRFOiIjRkFFQkQ3IixBUVVBOiIjMDBGRkZGIixBUVVBTUFSSU5FOiIjN0ZGRkQ0IixBWlVSRToiI0YwRkZGRiIsQkVJR0U6IiNGNUY1REMiLEJJU1FVRToiI0ZGRTRDNCIsQkxBQ0s6IiMwMDAwMDAiLEJMQU5DSEVEQUxNT05EOiIjRkZFQkNEIixCTFVFOiIjMDAwMEZGIixCTFVFVklPTEVUOiIjOEEyQkUyIixCUk9XTjoiI0E1MkEyQSIsQlVSTFlXT09EOiIjREVCODg3IixDQURFVEJMVUU6IiM1RjlFQTAiLENIQVJUUkVVU0U6IiM3RkZGMDAiLENIT0NPTEFURToiI0QyNjkxRSIsQ09SQUw6IiNGRjdGNTAiLENPUk5GTE9XRVJCTFVFOiIjNjQ5NUVEIixDT1JOU0lMSzoiI0ZGRjhEQyIsQ1JJTVNPTjoiI0RDMTQzQyIsQ1lBTjoiIzAwRkZGRiIsREFSS0JMVUU6IiMwMDAwOEIiLERBUktDWUFOOiIjMDA4QjhCIixEQVJLR09MREVOUk9EOiIjQjg4NjBCIixEQVJLR1JBWToiI0E5QTlBOSIsREFSS0dSRUVOOiIjMDA2NDAwIixEQVJLR1JFWToiI0E5QTlBOSIsREFSS0tIQUtJOiIjQkRCNzZCIixEQVJLTUFHRU5UQToiIzhCMDA4QiIsREFSS09MSVZFR1JFRU46IiM1NTZCMkYiLERBUktPUkFOR0U6IiNGRjhDMDAiLERBUktPUkNISUQ6IiM5OTMyQ0MiLERBUktSRUQ6IiM4QjAwMDAiLERBUktTQUxNT046IiNFOTk2N0EiLERBUktTRUFHUkVFTjoiIzhGQkM4RiIsREFSS1NMQVRFQkxVRToiIzQ4M0Q4QiIsREFSS1NMQVRFR1JBWToiIzJGNEY0RiIsREFSS1NMQVRFR1JFWToiIzJGNEY0RiIsREFSS1RVUlFVT0lTRToiIzAwQ0VEMSIsREFSS1ZJT0xFVDoiIzk0MDBEMyIsREVFUFBJTks6IiNGRjE0OTMiLERFRVBTS1lCTFVFOiIjMDBCRkZGIixESU1HUkFZOiIjNjk2OTY5IixESU1HUkVZOiIjNjk2OTY5IixET0RHRVJCTFVFOiIjMUU5MEZGIixGSVJFQlJJQ0s6IiNCMjIyMjIiLEZMT1JBTFdISVRFOiIjRkZGQUYwIixGT1JFU1RHUkVFTjoiIzIyOEIyMiIsRlVDSFNJQToiI0ZGMDBGRiIsR0FJTlNCT1JPOiIjRENEQ0RDIixHSE9TVFdISVRFOiIjRjhGOEZGIixHT0xEOiIjRkZENzAwIixHT0xERU5ST0Q6IiNEQUE1MjAiLEdSQVk6IiM4MDgwODAiLEdSRUVOOiIjMDA4MDAwIixHUkVFTllFTExPVzoiI0FERkYyRiIsR1JFWToiIzgwODA4MCIsSE9ORVlERVc6IiNGMEZGRjAiLEhPVFBJTks6IiNGRjY5QjQiLElORElBTlJFRDoiI0NENUM1QyIsSU5ESUdPOiIjNEIwMDgyIixJVk9SWToiI0ZGRkZGMCIsS0hBS0k6IiNGMEU2OEMiLExBVkVOREVSOiIjRTZFNkZBIixMQVZFTkRBUl9CTFVTSDoiI0ZGRjBGNSIsTEFXTkdSRUVOOiIjN0NGQzAwIixMRU1PTkNISUZGT046IiNGRkZBQ0QiLExJR0hUQkxVRToiI0FERDhFNiIsTElHSFRDT1JBTDoiI0YwODA4MCIsTElHSFRDWUFOOiIjRTBGRkZGIixMSUdIVEdPTERFTlJPRFlFTExPVzoiI0ZBRkFEMiIsTElHSFRHUkFZOiIjRDNEM0QzIixMSUdIVEdSRUVOOiIjOTBFRTkwIixMSUdIVEdSRVk6IiNEM0QzRDMiLExJR0hUUElOSzoiI0ZGQjZDMSIsTElHSFRTRUFHUkVFTjoiIzIwQjJBQSIsTElHSFRTS1lCTFVFOiIjODdDRUZBIixMSUdIVFNMQVRFR1JBWToiIzc3ODg5OSIsTElHSFRTTEFURUdSRVk6IiM3Nzg4OTkiLExJR0hUU1RFRUxCTFVFOiIjQjBDNERFIixMSUdIVFlFTExPVzoiI0ZGRkZFMCIsTElNRToiIzAwRkYwMCIsTElNRUdSRUVOOiIjMzJDRDMyIixMSU5FTjoiI0ZBRjBFNiIsTUFHRU5UQToiI0ZGMDBGRiIsTUFST09OOiIjODAwMDAwIixNRURJVU1BUVVBTUFSSU5FOiIjNjZDREFBIixNRURJVU1CTFVFOiIjMDAwMENEIixNRURJVU1PUkNISUQ6IiNCQTU1RDMiLE1FRElVTVBVUlBMRToiIzkzNzBEQiIsTUVESVVNU0VBR1JFRU46IiMzQ0IzNzEiLE1FRElVTVNMQVRFQkxVRToiIzdCNjhFRSIsTUVESVVNU1BSSU5HR1JFRU46IiMwMEZBOUEiLE1FRElVTVRVUlFVT0lTRToiIzQ4RDFDQyIsTUVESVVNVklPTEVUUkVEOiIjQzcxNTg1IixNSUROSUdIVEJMVUU6IiMxOTE5NzAiLE1JTlRDUkVBTToiI0Y1RkZGQSIsTUlTVFlST1NFOiIjRkZFNEUxIixNT0NDQVNJTjoiI0ZGRTRCNSIsTkFWQUpPV0hJVEU6IiNGRkRFQUQiLE5BVlk6IiMwMDAwODAiLE9MRExBQ0U6IiNGREY1RTYiLE9MSVZFOiIjODA4MDAwIixPTElWRURSQUI6IiM2QjhFMjMiLE9SQU5HRToiI0ZGQTUwMCIsT1JBTkdFUkVEOiIjRkY0NTAwIixPUkNISUQ6IiNEQTcwRDYiLFBBTEVHT0xERU5ST0Q6IiNFRUU4QUEiLFBBTEVHUkVFTjoiIzk4RkI5OCIsUEFMRVRVUlFVT0lTRToiI0FGRUVFRSIsUEFMRVZJT0xFVFJFRDoiI0RCNzA5MyIsUEFQQVlBV0hJUDoiI0ZGRUZENSIsUEVBQ0hQVUZGOiIjRkZEQUI5IixQRVJVOiIjQ0Q4NTNGIixQSU5LOiIjRkZDMENCIixQTFVNOiIjRERBMEREIixQT1dERVJCTFVFOiIjQjBFMEU2IixQVVJQTEU6IiM4MDAwODAiLFJFRDoiI0ZGMDAwMCIsUk9TWUJST1dOOiIjQkM4RjhGIixST1lBTEJMVUU6IiM0MTY5RTEiLFNBRERMRUJST1dOOiIjOEI0NTEzIixTQUxNT046IiNGQTgwNzIiLFNBTkRZQlJPV046IiNGNEE0NjAiLFNFQUdSRUVOOiIjMkU4QjU3IixTRUFTSEVMTDoiI0ZGRjVFRSIsU0lFTk5BOiIjQTA1MjJEIixTSUxWRVI6IiNDMEMwQzAiLFNLWUJMVUU6IiM4N0NFRUIiLFNMQVRFQkxVRToiIzZBNUFDRCIsU0xBVEVHUkFZOiIjNzA4MDkwIixTTEFURUdSRVk6IiM3MDgwOTAiLFNOT1c6IiNGRkZBRkEiLFNQUklOR0dSRUVOOiIjMDBGRjdGIixTVEVFTEJMVUU6IiM0NjgyQjQiLFRBTjoiI0QyQjQ4QyIsVEVBTDoiIzAwODA4MCIsVEhJU1RMRToiI0Q4QkZEOCIsVE9NQVRPOiIjRkY2MzQ3IixUVVJRVU9JU0U6IiM0MEUwRDAiLFZJT0xFVDoiI0VFODJFRSIsV0hFQVQ6IiNGNURFQjMiLFdISVRFOiIjRkZGRkZGIixXSElURVNNT0tFOiIjRjVGNUY1IixZRUxMT1c6IiNGRkZGMDAiLFlFTExPV0dSRUVOOiIjOUFDRDMyIn07ZnVuY3Rpb24gb2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pLGk9dGhpcy5fcmlnaHQuZXZhbHVhdGUobik7cmV0dXJuIGUodCxyLGkpfX1jb25zdCBZbj17YXRhbjI6R2UoTWF0aC5hdGFuMiwhMSkscG93OkdlKE1hdGgucG93LCExKSxtaW46R2UoTWF0aC5taW4sITApLG1heDpHZShNYXRoLm1heCwhMCksc3RhcnRzV2l0aDpHZShzZiwhMSl9O2Z1bmN0aW9uIEdlKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXtpZihlJiZ0eXBlb2YgaT09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJudW1iZXIiJiZ0eXBlb2YgaT09Im51bWJlciJ8fHR5cGVvZiByPT0ic3RyaW5nIiYmdHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiB0KHIsaSk7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtufSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtyfSBhbmQgJHtpfS5gKX19ZnVuY3Rpb24gc2YodCxlKXtyZXR1cm4gdC5zdGFydHNXaXRoKGUpfWZ1bmN0aW9uIGFmKHQpe2NvbnN0IGU9Wm5bdF07cmV0dXJuIGZ1bmN0aW9uKG4pe2NvbnN0IHI9dGhpcy5fbGVmdC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIpfX1jb25zdCBabj17YWJzOnV0KE1hdGguYWJzKSxzcXJ0OnV0KE1hdGguc3FydCksY29zOnV0KE1hdGguY29zKSxzaW46dXQoTWF0aC5zaW4pLHRhbjp1dChNYXRoLnRhbiksYWNvczp1dChNYXRoLmFjb3MpLGFzaW46dXQoTWF0aC5hc2luKSxhdGFuOnV0KE1hdGguYXRhbikscmFkaWFuczp1dChSLnRvUmFkaWFucyksZGVncmVlczp1dChSLnRvRGVncmVlcyksc2lnbjp1dChSLnNpZ24pLGZsb29yOnV0KE1hdGguZmxvb3IpLGNlaWw6dXQoTWF0aC5jZWlsKSxyb3VuZDp1dChNYXRoLnJvdW5kKSxleHAyOnV0KGNmKSxsb2c6dXQoTWF0aC5sb2cpLGxvZzI6dXQodWYpLGZyYWN0OnV0KGhmKX07ZnVuY3Rpb24gdXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7aWYodHlwZW9mIG49PSJudW1iZXIiKXJldHVybiB0KG4pO3Rocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gIiR7ZX0iIHJlcXVpcmVzIGEgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudC4gQXJndW1lbnQgaXMgJHtufS5gKX19ZnVuY3Rpb24gaGYodCl7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX1mdW5jdGlvbiBjZih0KXtyZXR1cm4gTWF0aC5wb3coMix0KX1mdW5jdGlvbiB1Zih0KXtyZXR1cm4gUi5sb2cyKHQpfWNvbnN0IGZmPS9ecmdiYT9cKFxzKihbMC05Ll0rJT8pXHMqLFxzKihbMC05Ll0rJT8pXHMqLFxzKihbMC05Ll0rJT8pKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2ksbGY9L15oc2xhP1woXHMqKFswLTkuXSspXHMqLFxzKihbMC05Ll0rJSlccyosXHMqKFswLTkuXSslKSg/OlxzKixccyooWzAtOS5dKykpP1xzKlwpJC9pO2NsYXNzIHR0e2NvbnN0cnVjdG9yKGUsbixyLGkpe0wodGhpcywicmVkIik7TCh0aGlzLCJncmVlbiIpO0wodGhpcywiYmx1ZSIpO0wodGhpcywiYWxwaGEiKTt0aGlzLnJlZD1kdChlLDEpLHRoaXMuZ3JlZW49ZHQobiwxKSx0aGlzLmJsdWU9ZHQociwxKSx0aGlzLmFscGhhPWR0KGksMSl9c3RhdGljIGJ5dGVUb0Zsb2F0KGUpe3JldHVybiBlLzI1NX1zdGF0aWMgZmxvYXRUb0J5dGUoZSl7cmV0dXJuIGU9PT0xPzI1NTplKjI1NnwwfXN0YXRpYyBmcm9tQ3NzQ29sb3JTdHJpbmcoZSl7ZT1lLnJlcGxhY2UoL1xzL2csIiIpO2NvbnN0IG49ZGYoZSk7aWYodHlwZW9mIG48InUiKXJldHVybiBuO2xldCByPW5mLmV4ZWMoZSk7aWYociE9PW51bGwpe2NvbnN0IGk9bmV3IHR0O3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPXJmLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IHR0O3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8yNTUsaS5ncmVlbj1wYXJzZUludChyWzJdLDE2KS8yNTUsaS5ibHVlPXBhcnNlSW50KHJbM10sMTYpLzI1NSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImZmIiksMTYpLzI1NSxpfWlmKHI9ZmYuZXhlYyhlKSxyIT09bnVsbCl7Y29uc3QgaT1uZXcgdHQ7cmV0dXJuIGkucmVkPXBhcnNlRmxvYXQoclsxXSkvKHJbMV0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmdyZWVuPXBhcnNlRmxvYXQoclsyXSkvKHJbMl0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmJsdWU9cGFyc2VGbG9hdChyWzNdKS8oclszXS5zdWJzdHIoLTEpPT09IiUiPzEwMDoyNTUpLGkuYWxwaGE9cGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSksaX1pZihyPWxmLmV4ZWMoZSksciE9PW51bGwpcmV0dXJuIHR0LmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLGg9cjtjb25zdCBhPW5ldyB0dDtpZihuIT09MCl7bGV0IGY7cjwuNT9mPXIqKDErbik6Zj1yK24tcipuO2NvbnN0IGQ9MipyLWY7bz1RbihkLGYsZSsxLzMpLHM9UW4oZCxmLGUpLGg9UW4oZCxmLGUtMS8zKX1yZXR1cm4gdHlwZW9mIGE+InUiP25ldyB0dChvLHMsaCxpKTooYS5yZWQ9byxhLmdyZWVuPXMsYS5ibHVlPWgsYS5hbHBoYT1pLGEpfX10b0Nzc0hleFN0cmluZygpe2xldCBlPXR0LmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49dHQuZmxvYXRUb0J5dGUodGhpcy5ncmVlbikudG9TdHJpbmcoMTYpO24ubGVuZ3RoPDImJihuPWAwJHtufWApO2xldCByPXR0LmZsb2F0VG9CeXRlKHRoaXMuYmx1ZSkudG9TdHJpbmcoMTYpO2lmKHIubGVuZ3RoPDImJihyPWAwJHtyfWApLHRoaXMuYWxwaGE8MSl7bGV0IGk9dHQuZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49dHQuYnl0ZVRvRmxvYXQoZHQobiwyNTUpKSxyPXR0LmJ5dGVUb0Zsb2F0KGR0KHIsMjU1KSksaT10dC5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyB0dChlLG4scixpKX19ZnVuY3Rpb24gZGYodCl7aWYodD10LnRvVXBwZXJDYXNlKCksZ2lbdF0pcmV0dXJuIHR0LmZyb21Dc3NDb2xvclN0cmluZyhnaVt0XSk7c3dpdGNoKHQpe2Nhc2UiVFJBTlNQQVJFTlQiOnJldHVybiBuZXcgdHQoMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIFFuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIER7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXtMKHRoaXMsIl90eXBlIik7TCh0aGlzLCJfdmFsdWUiKTtMKHRoaXMsIl9sZWZ0Iik7TCh0aGlzLCJfcmlnaHQiKTtMKHRoaXMsIl90ZXN0Iik7TCh0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgRi5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBGLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIEYuVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFpuW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9YWYobikpO2JyZWFrfWJyZWFrO2Nhc2UgRi5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2YgWW5bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1vZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBGLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIEYuQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgRi5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBGLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBGLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIEYuTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCBoPWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgaD4idSImJihoPSIiKSxyPXIucmVwbGFjZShvLGgpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1FZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgdHQ7aWYodGhpcy5fdmFsdWU9PT0iY29sb3IiKWlmKHR5cGVvZiBuPiJ1IilyPXR0LmZyb21CeXRlcygyNTUsMjU1LDI1NSwyNTUpO2Vsc2UgaWYobi5sZW5ndGg+MSl7Y29uc3QgaT10dC5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT10dC5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCl9ZWxzZSBpZih0aGlzLl92YWx1ZT09PSJyZ2IiKXI9dHQuZnJvbUJ5dGVzKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDI1NSk7ZWxzZSBpZih0aGlzLl92YWx1ZT09PSJyZ2JhIil7Y29uc3QgaT1uWzNdLmV2YWx1YXRlKGUpKjI1NTtyPXR0LmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9dHQuZnJvbUhzbChuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwxKTtpJiYocj1pKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbGEiKXtjb25zdCBpPXR0LmZyb21Ic2woblswXS5ldmFsdWF0ZShlKSxuWzFdLmV2YWx1YXRlKGUpLG5bMl0uZXZhbHVhdGUoZSksblszXS5ldmFsdWF0ZShlKSk7aSYmKHI9aSl9cmV0dXJuIHIudG9Dc3NIZXhTdHJpbmcoKX1fZXZhbHVhdGVFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHd0KG4pJiYhd3Qocik/bi5pbmNsdWRlcyhyKTp3dChyKSYmIXd0KG4pP3IuaW5jbHVkZXMobik6KHd0KHIpJiZ3dChuKSYmY29uc29sZS5lcnJvcigiRXF1YWxzIGxlZnQgYW5kIHJpZ2h0IGJvdGggY2FuJ3QgYmUgYXJyYXkgYXQgdGhlIHNhbWUgdGltZSIpLG49PXIpfV9ldmFsdWF0ZU5vdEVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gd3QobikmJiF3dChyKT8hbi5pbmNsdWRlcyhyKTp3dChyKSYmIXd0KG4pPyFyLmluY2x1ZGVzKG4pOih3dChyKSYmd3QobikmJmNvbnNvbGUuZXJyb3IoIk5vdEVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuIT1yKX19ZnVuY3Rpb24gRWYodCl7aWYodHlwZW9mIHQhPSJzdHJpbmciKXJldHVybiB0O2NvbnN0IGU9WyIlIl07Zm9yKGNvbnN0IG4gb2YgZSlpZih0LmVuZHNXaXRoKG4pKXJldHVybiB0LnNsaWNlKDAsLW4ubGVuZ3RoKS50cmltKCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIG1pKHQpe3JldHVybiB0Ll92YWx1ZT09PSJmZWF0dXJlIn1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KX1jbGFzcyBfZnthZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3MgcGZ7Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT1hcmd1bWVudHNbcl07bi5mb3JFYWNoKGk9PntpZih0eXBlb2YgaSE9Im9iamVjdCJ8fCFpLm5hbWV8fCFpLmluaXQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIEpTRVAgcGx1Z2luIGZvcm1hdCIpO3RoaXMucmVnaXN0ZXJlZFtpLm5hbWVdfHwoaS5pbml0KHRoaXMuanNlcCksdGhpcy5yZWdpc3RlcmVkW2kubmFtZV09aSl9KX19Y2xhc3MgRXtzdGF0aWMgZ2V0IHZlcnNpb24oKXtyZXR1cm4iMS40LjAifXN0YXRpYyB0b1N0cmluZygpe3JldHVybiJKYXZhU2NyaXB0IEV4cHJlc3Npb24gUGFyc2VyIChKU0VQKSB2IitFLnZlcnNpb259c3RhdGljIGFkZFVuYXJ5T3AoZSl7cmV0dXJuIEUubWF4X3Vub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLEUubWF4X3Vub3BfbGVuKSxFLnVuYXJ5X29wc1tlXT0xLEV9c3RhdGljIGFkZEJpbmFyeU9wKGUsbixyKXtyZXR1cm4gRS5tYXhfYmlub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLEUubWF4X2Jpbm9wX2xlbiksRS5iaW5hcnlfb3BzW2VdPW4scj9FLnJpZ2h0X2Fzc29jaWF0aXZlLmFkZChlKTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmRlbGV0ZShlKSxFfXN0YXRpYyBhZGRJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuYWRkKGUpLEV9c3RhdGljIGFkZExpdGVyYWwoZSxuKXtyZXR1cm4gRS5saXRlcmFsc1tlXT1uLEV9c3RhdGljIHJlbW92ZVVuYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSBFLnVuYXJ5X29wc1tlXSxlLmxlbmd0aD09PUUubWF4X3Vub3BfbGVuJiYoRS5tYXhfdW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS51bmFyeV9vcHMpKSxFfXN0YXRpYyByZW1vdmVBbGxVbmFyeU9wcygpe3JldHVybiBFLnVuYXJ5X29wcz17fSxFLm1heF91bm9wX2xlbj0wLEV9c3RhdGljIHJlbW92ZUlkZW50aWZpZXJDaGFyKGUpe3JldHVybiBFLmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5kZWxldGUoZSksRX1zdGF0aWMgcmVtb3ZlQmluYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSBFLmJpbmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF9iaW5vcF9sZW4mJihFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKSksRS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgcmVtb3ZlQWxsQmluYXJ5T3BzKCl7cmV0dXJuIEUuYmluYXJ5X29wcz17fSxFLm1heF9iaW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVMaXRlcmFsKGUpe3JldHVybiBkZWxldGUgRS5saXRlcmFsc1tlXSxFfXN0YXRpYyByZW1vdmVBbGxMaXRlcmFscygpe3JldHVybiBFLmxpdGVyYWxzPXt9LEV9Z2V0IGNoYXIoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KX1nZXQgY29kZSgpe3JldHVybiB0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KX1jb25zdHJ1Y3RvcihlKXt0aGlzLmV4cHI9ZSx0aGlzLmluZGV4PTB9c3RhdGljIHBhcnNlKGUpe3JldHVybiBuZXcgRShlKS5wYXJzZSgpfXN0YXRpYyBnZXRNYXhLZXlMZW4oZSl7cmV0dXJuIE1hdGgubWF4KDAsLi4uT2JqZWN0LmtleXMoZSkubWFwKG49Pm4ubGVuZ3RoKSl9c3RhdGljIGlzRGVjaW1hbERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTd9c3RhdGljIGJpbmFyeVByZWNlZGVuY2UoZSl7cmV0dXJuIEUuYmluYXJ5X29wc1tlXXx8MH1zdGF0aWMgaXNJZGVudGlmaWVyU3RhcnQoZSl7cmV0dXJuIGU+PTY1JiZlPD05MHx8ZT49OTcmJmU8PTEyMnx8ZT49MTI4JiYhRS5iaW5hcnlfb3BzW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldfHxFLmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5oYXMoU3RyaW5nLmZyb21DaGFyQ29kZShlKSl9c3RhdGljIGlzSWRlbnRpZmllclBhcnQoZSl7cmV0dXJuIEUuaXNJZGVudGlmaWVyU3RhcnQoZSl8fEUuaXNEZWNpbWFsRGlnaXQoZSl9dGhyb3dFcnJvcihlKXtjb25zdCBuPW5ldyBFcnJvcihlKyIgYXQgY2hhcmFjdGVyICIrdGhpcy5pbmRleCk7dGhyb3cgbi5pbmRleD10aGlzLmluZGV4LG4uZGVzY3JpcHRpb249ZSxufXJ1bkhvb2soZSxuKXtpZihFLmhvb2tzW2VdKXtjb25zdCByPXtjb250ZXh0OnRoaXMsbm9kZTpufTtyZXR1cm4gRS5ob29rcy5ydW4oZSxyKSxyLm5vZGV9cmV0dXJuIG59c2VhcmNoSG9vayhlKXtpZihFLmhvb2tzW2VdKXtjb25zdCBuPXtjb250ZXh0OnRoaXN9O3JldHVybiBFLmhvb2tzW2VdLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2FsbChuLmNvbnRleHQsbiksbi5ub2RlfSksbi5ub2RlfX1nb2JibGVTcGFjZXMoKXtsZXQgZT10aGlzLmNvZGU7Zm9yKDtlPT09RS5TUEFDRV9DT0RFfHxlPT09RS5UQUJfQ09ERXx8ZT09PUUuTEZfQ09ERXx8ZT09PUUuQ1JfQ09ERTspZT10aGlzLmV4cHIuY2hhckNvZGVBdCgrK3RoaXMuaW5kZXgpO3RoaXMucnVuSG9vaygiZ29iYmxlLXNwYWNlcyIpfXBhcnNlKCl7dGhpcy5ydW5Ib29rKCJiZWZvcmUtYWxsIik7Y29uc3QgZT10aGlzLmdvYmJsZUV4cHJlc3Npb25zKCksbj1lLmxlbmd0aD09PTE/ZVswXTp7dHlwZTpFLkNPTVBPVU5ELGJvZHk6ZX07cmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItYWxsIixuKX1nb2JibGVFeHByZXNzaW9ucyhlKXtsZXQgbj1bXSxyLGk7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KWlmKHI9dGhpcy5jb2RlLHI9PT1FLlNFTUNPTF9DT0RFfHxyPT09RS5DT01NQV9DT0RFKXRoaXMuaW5kZXgrKztlbHNlIGlmKGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCkpbi5wdXNoKGkpO2Vsc2UgaWYodGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoKXtpZihyPT09ZSlicmVhazt0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgIicrdGhpcy5jaGFyKyciJyl9cmV0dXJuIG59Z29iYmxlRXhwcmVzc2lvbigpe2NvbnN0IGU9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtZXhwcmVzc2lvbiIpfHx0aGlzLmdvYmJsZUJpbmFyeUV4cHJlc3Npb24oKTtyZXR1cm4gdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLnJ1bkhvb2soImFmdGVyLWV4cHJlc3Npb24iLGUpfWdvYmJsZUJpbmFyeU9wKCl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgZT10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfYmlub3BfbGVuKSxuPWUubGVuZ3RoO2Zvcig7bj4wOyl7aWYoRS5iaW5hcnlfb3BzLmhhc093blByb3BlcnR5KGUpJiYoIUUuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlKXx8dGhpcy5pbmRleCtlLmxlbmd0aDx0aGlzLmV4cHIubGVuZ3RoJiYhRS5pc0lkZW50aWZpZXJQYXJ0KHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrZS5sZW5ndGgpKSkpcmV0dXJuIHRoaXMuaW5kZXgrPW4sZTtlPWUuc3Vic3RyKDAsLS1uKX1yZXR1cm4hMX1nb2JibGVCaW5hcnlFeHByZXNzaW9uKCl7bGV0IGUsbixyLGksbyxzLGgsYSxmO2lmKHM9dGhpcy5nb2JibGVUb2tlbigpLCFzfHwobj10aGlzLmdvYmJsZUJpbmFyeU9wKCksIW4pKXJldHVybiBzO2ZvcihvPXt2YWx1ZTpuLHByZWM6RS5iaW5hcnlQcmVjZWRlbmNlKG4pLHJpZ2h0X2E6RS5yaWdodF9hc3NvY2lhdGl2ZS5oYXMobil9LGg9dGhpcy5nb2JibGVUb2tlbigpLGh8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK24pLGk9W3MsbyxoXTtuPXRoaXMuZ29iYmxlQmluYXJ5T3AoKTspe2lmKHI9RS5iaW5hcnlQcmVjZWRlbmNlKG4pLHI9PT0wKXt0aGlzLmluZGV4LT1uLmxlbmd0aDticmVha31vPXt2YWx1ZTpuLHByZWM6cixyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSxmPW47Y29uc3QgZD1fPT5vLnJpZ2h0X2EmJl8ucmlnaHRfYT9yPl8ucHJlYzpyPD1fLnByZWM7Zm9yKDtpLmxlbmd0aD4yJiZkKGlbaS5sZW5ndGgtMl0pOyloPWkucG9wKCksbj1pLnBvcCgpLnZhbHVlLHM9aS5wb3AoKSxlPXt0eXBlOkUuQklOQVJZX0VYUCxvcGVyYXRvcjpuLGxlZnQ6cyxyaWdodDpofSxpLnB1c2goZSk7ZT10aGlzLmdvYmJsZVRva2VuKCksZXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIGFmdGVyICIrZiksaS5wdXNoKG8sZSl9Zm9yKGE9aS5sZW5ndGgtMSxlPWlbYV07YT4xOyllPXt0eXBlOkUuQklOQVJZX0VYUCxvcGVyYXRvcjppW2EtMV0udmFsdWUsbGVmdDppW2EtMl0scmlnaHQ6ZX0sYS09MjtyZXR1cm4gZX1nb2JibGVUb2tlbigpe2xldCBlLG4scixpO2lmKHRoaXMuZ29iYmxlU3BhY2VzKCksaT10aGlzLnNlYXJjaEhvb2soImdvYmJsZS10b2tlbiIpLGkpcmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpO2lmKGU9dGhpcy5jb2RlLEUuaXNEZWNpbWFsRGlnaXQoZSl8fGU9PT1FLlBFUklPRF9DT0RFKXJldHVybiB0aGlzLmdvYmJsZU51bWVyaWNMaXRlcmFsKCk7aWYoZT09PUUuU1FVT1RFX0NPREV8fGU9PT1FLkRRVU9URV9DT0RFKWk9dGhpcy5nb2JibGVTdHJpbmdMaXRlcmFsKCk7ZWxzZSBpZihlPT09RS5PQlJBQ0tfQ09ERSlpPXRoaXMuZ29iYmxlQXJyYXkoKTtlbHNle2ZvcihuPXRoaXMuZXhwci5zdWJzdHIodGhpcy5pbmRleCxFLm1heF91bm9wX2xlbikscj1uLmxlbmd0aDtyPjA7KXtpZihFLnVuYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShuKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrbi5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K24ubGVuZ3RoKSkpKXt0aGlzLmluZGV4Kz1yO2NvbnN0IG89dGhpcy5nb2JibGVUb2tlbigpO3JldHVybiBvfHx0aGlzLnRocm93RXJyb3IoIm1pc3NpbmcgdW5hcnlPcCBhcmd1bWVudCIpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLHt0eXBlOkUuVU5BUllfRVhQLG9wZXJhdG9yOm4sYXJndW1lbnQ6byxwcmVmaXg6ITB9KX1uPW4uc3Vic3RyKDAsLS1yKX1FLmlzSWRlbnRpZmllclN0YXJ0KGUpPyhpPXRoaXMuZ29iYmxlSWRlbnRpZmllcigpLEUubGl0ZXJhbHMuaGFzT3duUHJvcGVydHkoaS5uYW1lKT9pPXt0eXBlOkUuTElURVJBTCx2YWx1ZTpFLmxpdGVyYWxzW2kubmFtZV0scmF3OmkubmFtZX06aS5uYW1lPT09RS50aGlzX3N0ciYmKGk9e3R5cGU6RS5USElTX0VYUH0pKTplPT09RS5PUEFSRU5fQ09ERSYmKGk9dGhpcy5nb2JibGVHcm91cCgpKX1yZXR1cm4gaT8oaT10aGlzLmdvYmJsZVRva2VuUHJvcGVydHkoaSksdGhpcy5ydW5Ib29rKCJhZnRlci10b2tlbiIsaSkpOnRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLCExKX1nb2JibGVUb2tlblByb3BlcnR5KGUpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IG49dGhpcy5jb2RlO2Zvcig7bj09PUUuUEVSSU9EX0NPREV8fG49PT1FLk9CUkFDS19DT0RFfHxuPT09RS5PUEFSRU5fQ09ERXx8bj09PUUuUVVNQVJLX0NPREU7KXtsZXQgcjtpZihuPT09RS5RVU1BUktfQ09ERSl7aWYodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKSE9PUUuUEVSSU9EX0NPREUpYnJlYWs7cj0hMCx0aGlzLmluZGV4Kz0yLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9dGhpcy5pbmRleCsrLG49PT1FLk9CUkFDS19DT0RFPyhlPXt0eXBlOkUuTUVNQkVSX0VYUCxjb21wdXRlZDohMCxvYmplY3Q6ZSxwcm9wZXJ0eTp0aGlzLmdvYmJsZUV4cHJlc3Npb24oKX0sZS5wcm9wZXJ0eXx8dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IHlmPW5ldyBfZjtPYmplY3QuYXNzaWduKEUse2hvb2tzOnlmLHBsdWdpbnM6bmV3IHBmKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiPz8iOjEsIiYmIjoyLCJ8IjozLCJeIjo0LCImIjo1LCI9PSI6NiwiIT0iOjYsIj09PSI6NiwiIT09Ijo2LCI8Ijo3LCI+Ijo3LCI8PSI6NywiPj0iOjcsIjw8Ijo4LCI+PiI6OCwiPj4+Ijo4LCIrIjo5LCItIjo5LCIqIjoxMCwiLyI6MTAsIiUiOjEwLCIqKiI6MTF9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQoWyIqKiJdKSxhZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnM6bmV3IFNldChbIiQiLCJfIl0pLGxpdGVyYWxzOnt0cnVlOiEwLGZhbHNlOiExLG51bGw6bnVsbH0sdGhpc19zdHI6InRoaXMifSksRS5tYXhfdW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS51bmFyeV9vcHMpLEUubWF4X2Jpbm9wX2xlbj1FLmdldE1heEtleUxlbihFLmJpbmFyeV9vcHMpO2NvbnN0IEh0PXQ9Pm5ldyBFKHQpLnBhcnNlKCksQWY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2xhc3N7fSk7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRSkuZmlsdGVyKHQ9PiFBZi5pbmNsdWRlcyh0KSYmSHRbdF09PT12b2lkIDApLmZvckVhY2godD0+e0h0W3RdPUVbdF19KSxIdC5Kc2VwPUU7Y29uc3QgeGY9IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI7dmFyIE9mPXtuYW1lOiJ0ZXJuYXJ5Iixpbml0KHQpe3QuaG9va3MuYWRkKCJhZnRlci1leHByZXNzaW9uIixmdW5jdGlvbihuKXtpZihuLm5vZGUmJnRoaXMuY29kZT09PXQuUVVNQVJLX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCByPW4ubm9kZSxpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKGl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5jb2RlPT09dC5DT0xPTl9DT0RFKXt0aGlzLmluZGV4Kys7Y29uc3Qgbz10aGlzLmdvYmJsZUV4cHJlc3Npb24oKTtpZihvfHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24iKSxuLm5vZGU9e3R5cGU6eGYsdGVzdDpyLGNvbnNlcXVlbnQ6aSxhbHRlcm5hdGU6b30sci5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3Iub3BlcmF0b3JdPD0uOSl7bGV0IHM9cjtmb3IoO3MucmlnaHQub3BlcmF0b3ImJnQuYmluYXJ5X29wc1tzLnJpZ2h0Lm9wZXJhdG9yXTw9Ljk7KXM9cy5yaWdodDtuLm5vZGUudGVzdD1zLnJpZ2h0LHMucmlnaHQ9bi5ub2RlLG4ubm9kZT1yfX1lbHNlIHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgOiIpfX0pfX07SHQucGx1Z2lucy5yZWdpc3RlcihPZik7Y29uc3QgU2k9NDcsVGY9OTI7dmFyIFJmPXtuYW1lOiJyZWdleCIsaW5pdCh0KXt0Lmhvb2tzLmFkZCgiZ29iYmxlLXRva2VuIixmdW5jdGlvbihuKXtpZih0aGlzLmNvZGU9PT1TaSl7Y29uc3Qgcj0rK3RoaXMuaW5kZXg7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtpZih0aGlzLmNvZGU9PT1TaSYmIWkpe2NvbnN0IG89dGhpcy5leHByLnNsaWNlKHIsdGhpcy5pbmRleCk7bGV0IHM9IiI7Zm9yKDsrK3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aDspe2NvbnN0IGE9dGhpcy5jb2RlO2lmKGE+PTk3JiZhPD0xMjJ8fGE+PTY1JiZhPD05MHx8YT49NDgmJmE8PTU3KXMrPXRoaXMuY2hhcjtlbHNlIGJyZWFrfWxldCBoO3RyeXtoPW5ldyBSZWdFeHAobyxzKX1jYXRjaChhKXt0aGlzLnRocm93RXJyb3IoYS5tZXNzYWdlKX1yZXR1cm4gbi5ub2RlPXt0eXBlOnQuTElURVJBTCx2YWx1ZTpoLHJhdzp0aGlzLmV4cHIuc2xpY2Uoci0xLHRoaXMuaW5kZXgpfSxuLm5vZGU9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KG4ubm9kZSksbi5ub2RlfXRoaXMuY29kZT09PXQuT0JSQUNLX0NPREU/aT0hMDppJiZ0aGlzLmNvZGU9PT10LkNCUkFDS19DT0RFJiYoaT0hMSksdGhpcy5pbmRleCs9dGhpcy5jb2RlPT09VGY/MjoxfXRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgUmVnZXgiKX19KX19O2NvbnN0IEpuPTQzLHdlPXtuYW1lOiJhc3NpZ25tZW50Iixhc3NpZ25tZW50T3BlcmF0b3JzOm5ldyBTZXQoWyI9IiwiKj0iLCIqKj0iLCIvPSIsIiU9IiwiKz0iLCItPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsIl49IiwifD0iLCJ8fD0iLCImJj0iLCI/Pz0iXSksdXBkYXRlT3BlcmF0b3JzOltKbiw0NV0sYXNzaWdubWVudFByZWNlZGVuY2U6LjksaW5pdCh0KXtjb25zdCBlPVt0LklERU5USUZJRVIsdC5NRU1CRVJfRVhQXTt3ZS5hc3NpZ25tZW50T3BlcmF0b3JzLmZvckVhY2gocj0+dC5hZGRCaW5hcnlPcChyLHdlLmFzc2lnbm1lbnRQcmVjZWRlbmNlLCEwKSksdC5ob29rcy5hZGQoImdvYmJsZS10b2tlbiIsZnVuY3Rpb24oaSl7Y29uc3Qgbz10aGlzLmNvZGU7d2UudXBkYXRlT3BlcmF0b3JzLnNvbWUocz0+cz09PW8mJnM9PT10aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KzEpKSYmKHRoaXMuaW5kZXgrPTIsaS5ub2RlPXt0eXBlOiJVcGRhdGVFeHByZXNzaW9uIixvcGVyYXRvcjpvPT09Sm4/IisrIjoiLS0iLGFyZ3VtZW50OnRoaXMuZ29iYmxlVG9rZW5Qcm9wZXJ0eSh0aGlzLmdvYmJsZUlkZW50aWZpZXIoKSkscHJlZml4OiEwfSwoIWkubm9kZS5hcmd1bWVudHx8IWUuaW5jbHVkZXMoaS5ub2RlLmFyZ3VtZW50LnR5cGUpKSYmdGhpcy50aHJvd0Vycm9yKGBVbmV4cGVjdGVkICR7aS5ub2RlLm9wZXJhdG9yfWApKX0pLHQuaG9va3MuYWRkKCJhZnRlci10b2tlbiIsZnVuY3Rpb24oaSl7aWYoaS5ub2RlKXtjb25zdCBvPXRoaXMuY29kZTt3ZS51cGRhdGVPcGVyYXRvcnMuc29tZShzPT5zPT09byYmcz09PXRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkpJiYoZS5pbmNsdWRlcyhpLm5vZGUudHlwZSl8fHRoaXMudGhyb3dFcnJvcihgVW5leHBlY3RlZCAke2kubm9kZS5vcGVyYXRvcn1gKSx0aGlzLmluZGV4Kz0yLGkubm9kZT17dHlwZToiVXBkYXRlRXhwcmVzc2lvbiIsb3BlcmF0b3I6bz09PUpuPyIrKyI6Ii0tIixhcmd1bWVudDppLm5vZGUscHJlZml4OiExfSl9fSksdC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKGkpe2kubm9kZSYmbihpLm5vZGUpfSk7ZnVuY3Rpb24gbihyKXt3ZS5hc3NpZ25tZW50T3BlcmF0b3JzLmhhcyhyLm9wZXJhdG9yKT8oci50eXBlPSJBc3NpZ25tZW50RXhwcmVzc2lvbiIsbihyLmxlZnQpLG4oci5yaWdodCkpOnIub3BlcmF0b3J8fE9iamVjdC52YWx1ZXMocikuZm9yRWFjaChpPT57aSYmdHlwZW9mIGk9PSJvYmplY3QiJiZuKGkpfSl9fX07SHQucGx1Z2lucy5yZWdpc3RlcihSZix3ZSksSHQuYWRkVW5hcnlPcCgidHlwZW9mIiksSHQuYWRkTGl0ZXJhbCgibnVsbCIsbnVsbCksSHQuYWRkTGl0ZXJhbCgidW5kZWZpbmVkIix2b2lkIDApO2NvbnN0IGJmPW5ldyBTZXQoWyJjb25zdHJ1Y3RvciIsIl9fcHJvdG9fXyIsIl9fZGVmaW5lR2V0dGVyX18iLCJfX2RlZmluZVNldHRlcl9fIl0pLHE9e2V2YWxBc3QodCxlKXtzd2l0Y2godC50eXBlKXtjYXNlIkJpbmFyeUV4cHJlc3Npb24iOmNhc2UiTG9naWNhbEV4cHJlc3Npb24iOnJldHVybiBxLmV2YWxCaW5hcnlFeHByZXNzaW9uKHQsZSk7Y2FzZSJDb21wb3VuZCI6cmV0dXJuIHEuZXZhbENvbXBvdW5kKHQsZSk7Y2FzZSJDb25kaXRpb25hbEV4cHJlc3Npb24iOnJldHVybiBxLmV2YWxDb25kaXRpb25hbEV4cHJlc3Npb24odCxlKTtjYXNlIklkZW50aWZpZXIiOnJldHVybiBxLmV2YWxJZGVudGlmaWVyKHQsZSk7Y2FzZSJMaXRlcmFsIjpyZXR1cm4gcS5ldmFsTGl0ZXJhbCh0LGUpO2Nhc2UiTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbE1lbWJlckV4cHJlc3Npb24odCxlKTtjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbFVuYXJ5RXhwcmVzc2lvbih0LGUpO2Nhc2UiQXJyYXlFeHByZXNzaW9uIjpyZXR1cm4gcS5ldmFsQXJyYXlFeHByZXNzaW9uKHQsZSk7Y2FzZSJDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbENhbGxFeHByZXNzaW9uKHQsZSk7Y2FzZSJBc3NpZ25tZW50RXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbEFzc2lnbm1lbnRFeHByZXNzaW9uKHQsZSk7ZGVmYXVsdDp0aHJvdyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBleHByZXNzaW9uIix0KX19LGV2YWxCaW5hcnlFeHByZXNzaW9uKHQsZSl7cmV0dXJueyJ8fCI6KHIsaSk9PnJ8fGkoKSwiJiYiOihyLGkpPT5yJiZpKCksInwiOihyLGkpPT5yfGkoKSwiXiI6KHIsaSk9PnJeaSgpLCImIjoocixpKT0+ciZpKCksIj09IjoocixpKT0+cj09aSgpLCIhPSI6KHIsaSk9PnIhPWkoKSwiPT09IjoocixpKT0+cj09PWkoKSwiIT09IjoocixpKT0+ciE9PWkoKSwiPCI6KHIsaSk9PnI8aSgpLCI+IjoocixpKT0+cj5pKCksIjw9IjoocixpKT0+cjw9aSgpLCI+PSI6KHIsaSk9PnI+PWkoKSwiPDwiOihyLGkpPT5yPDxpKCksIj4+IjoocixpKT0+cj4+aSgpLCI+Pj4iOihyLGkpPT5yPj4+aSgpLCIrIjoocixpKT0+citpKCksIi0iOihyLGkpPT5yLWkoKSwiKiI6KHIsaSk9PnIqaSgpLCIvIjoocixpKT0+ci9pKCksIiUiOihyLGkpPT5yJWkoKX1bdC5vcGVyYXRvcl0ocS5ldmFsQXN0KHQubGVmdCxlKSwoKT0+cS5ldmFsQXN0KHQucmlnaHQsZSkpfSxldmFsQ29tcG91bmQodCxlKXtsZXQgbjtmb3IobGV0IHI9MDtyPHQuYm9keS5sZW5ndGg7cisrKXt0LmJvZHlbcl0udHlwZT09PSJJZGVudGlmaWVyIiYmWyJ2YXIiLCJsZXQiLCJjb25zdCJdLmluY2x1ZGVzKHQuYm9keVtyXS5uYW1lKSYmdC5ib2R5W3IrMV0mJnQuYm9keVtyKzFdLnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iJiYocis9MSk7Y29uc3QgaT10LmJvZHlbcl07bj1xLmV2YWxBc3QoaSxlKX1yZXR1cm4gbn0sZXZhbENvbmRpdGlvbmFsRXhwcmVzc2lvbih0LGUpe3JldHVybiBxLmV2YWxBc3QodC50ZXN0LGUpP3EuZXZhbEFzdCh0LmNvbnNlcXVlbnQsZSk6cS5ldmFsQXN0KHQuYWx0ZXJuYXRlLGUpfSxldmFsSWRlbnRpZmllcih0LGUpe2lmKE9iamVjdC5oYXNPd24oZSx0Lm5hbWUpKXJldHVybiBlW3QubmFtZV07dGhyb3cgUmVmZXJlbmNlRXJyb3IoYCR7dC5uYW1lfSBpcyBub3QgZGVmaW5lZGApfSxldmFsTGl0ZXJhbCh0KXtyZXR1cm4gdC52YWx1ZX0sZXZhbE1lbWJlckV4cHJlc3Npb24odCxlKXtjb25zdCBuPVN0cmluZyh0LmNvbXB1dGVkP3EuZXZhbEFzdCh0LnByb3BlcnR5KTp0LnByb3BlcnR5Lm5hbWUpLHI9cS5ldmFsQXN0KHQub2JqZWN0LGUpO2lmKHI9PW51bGwpdGhyb3cgVHlwZUVycm9yKGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mICR7cn0gKHJlYWRpbmcgJyR7bn0nKWApO2lmKCFPYmplY3QuaGFzT3duKHIsbikmJmJmLmhhcyhuKSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgJHtyfSAocmVhZGluZyAnJHtufScpYCk7Y29uc3QgaT1yW25dO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIj9pLmJpbmQocik6aX0sZXZhbFVuYXJ5RXhwcmVzc2lvbih0LGUpe3JldHVybnsiLSI6cj0+LXEuZXZhbEFzdChyLGUpLCIhIjpyPT4hcS5ldmFsQXN0KHIsZSksIn4iOnI9Pn5xLmV2YWxBc3QocixlKSwiKyI6cj0+K3EuZXZhbEFzdChyLGUpLHR5cGVvZjpyPT50eXBlb2YgcS5ldmFsQXN0KHIsZSl9W3Qub3BlcmF0b3JdKHQuYXJndW1lbnQpfSxldmFsQXJyYXlFeHByZXNzaW9uKHQsZSl7cmV0dXJuIHQuZWxlbWVudHMubWFwKG49PnEuZXZhbEFzdChuLGUpKX0sZXZhbENhbGxFeHByZXNzaW9uKHQsZSl7Y29uc3Qgbj10LmFyZ3VtZW50cy5tYXAoaT0+cS5ldmFsQXN0KGksZSkpO3JldHVybiBxLmV2YWxBc3QodC5jYWxsZWUsZSkoLi4ubil9LGV2YWxBc3NpZ25tZW50RXhwcmVzc2lvbih0LGUpe2lmKHQubGVmdC50eXBlIT09IklkZW50aWZpZXIiKXRocm93IFN5bnRheEVycm9yKCJJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGFzc2lnbm1lbnQiKTtjb25zdCBuPXQubGVmdC5uYW1lLHI9cS5ldmFsQXN0KHQucmlnaHQsZSk7cmV0dXJuIGVbbl09cixlW25dfX07Y2xhc3MgZ2Z7Y29uc3RydWN0b3IoZSl7dGhpcy5jb2RlPWUsdGhpcy5hc3Q9SHQodGhpcy5jb2RlKX1ydW5Jbk5ld0NvbnRleHQoZSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksZSk7cmV0dXJuIHEuZXZhbEFzdCh0aGlzLmFzdCxuKX19ZnVuY3Rpb24gSnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9Y2xhc3MgbWYgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcignSlNPTlBhdGggc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCAibmV3IiAoaXQgcHJldmVudHMgcmV0dXJuIG9mICh1bndyYXBwZWQpIHNjYWxhciB2YWx1ZXMpJyksdGhpcy5hdm9pZE5ldz0hMCx0aGlzLnZhbHVlPWUsdGhpcy5uYW1lPSJOZXdFcnJvciJ9fWZ1bmN0aW9uICQodCxlLG4scixpKXtpZighKHRoaXMgaW5zdGFuY2VvZiAkKSl0cnl7cmV0dXJuIG5ldyAkKHQsZSxuLHIsaSl9Y2F0Y2gocyl7aWYoIXMuYXZvaWROZXcpdGhyb3cgcztyZXR1cm4gcy52YWx1ZX10eXBlb2YgdD09InN0cmluZyImJihpPXIscj1uLG49ZSxlPXQsdD1udWxsKTtjb25zdCBvPXQmJnR5cGVvZiB0PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1PYmplY3QuaGFzT3duKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5ldmFsPXQuZXZhbD09PXZvaWQgMD8ic2FmZSI6dC5ldmFsLHRoaXMuaWdub3JlRXZhbEVycm9ycz10eXBlb2YgdC5pZ25vcmVFdmFsRXJyb3JzPiJ1Ij8hMTp0Lmlnbm9yZUV2YWxFcnJvcnMsdGhpcy5wYXJlbnQ9dC5wYXJlbnR8fG51bGwsdGhpcy5wYXJlbnRQcm9wZXJ0eT10LnBhcmVudFByb3BlcnR5fHxudWxsLHRoaXMuY2FsbGJhY2s9dC5jYWxsYmFja3x8cnx8bnVsbCx0aGlzLm90aGVyVHlwZUNhbGxiYWNrPXQub3RoZXJUeXBlQ2FsbGJhY2t8fGl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3Qgc3VwcGx5IGFuIG90aGVyVHlwZUNhbGxiYWNrIGNhbGxiYWNrIG9wdGlvbiB3aXRoIHRoZSBAb3RoZXIoKSBvcGVyYXRvci4iKX0sdC5hdXRvc3RhcnQhPT0hMSl7Y29uc3Qgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjtjb25zdCBoPXRoaXMuZXZhbHVhdGUocyk7aWYoIWh8fHR5cGVvZiBoIT0ib2JqZWN0Iil0aHJvdyBuZXcgbWYoaCk7cmV0dXJuIGh9fSQucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2xldCBpPXRoaXMucGFyZW50LG89dGhpcy5wYXJlbnRQcm9wZXJ0eSx7ZmxhdHRlbjpzLHdyYXA6aH09dGhpcztpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJFdmFsPXRoaXMuZXZhbCx0aGlzLmN1cnJTYW5kYm94PXRoaXMuc2FuZGJveCxuPW58fHRoaXMuY2FsbGJhY2ssdGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2s9cnx8dGhpcy5vdGhlclR5cGVDYWxsYmFjayxlPWV8fHRoaXMuanNvbix0PXR8fHRoaXMucGF0aCx0JiZ0eXBlb2YgdD09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIU9iamVjdC5oYXNPd24odCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTsoe2pzb246ZX09dCkscz1PYmplY3QuaGFzT3duKHQsImZsYXR0ZW4iKT90LmZsYXR0ZW46cyx0aGlzLmN1cnJSZXN1bHRUeXBlPU9iamVjdC5oYXNPd24odCwicmVzdWx0VHlwZSIpP3QucmVzdWx0VHlwZTp0aGlzLmN1cnJSZXN1bHRUeXBlLHRoaXMuY3VyclNhbmRib3g9T2JqZWN0Lmhhc093bih0LCJzYW5kYm94Iik/dC5zYW5kYm94OnRoaXMuY3VyclNhbmRib3gsaD1PYmplY3QuaGFzT3duKHQsIndyYXAiKT90LndyYXA6aCx0aGlzLmN1cnJFdmFsPU9iamVjdC5oYXNPd24odCwiZXZhbCIpP3QuZXZhbDp0aGlzLmN1cnJFdmFsLG49T2JqZWN0Lmhhc093bih0LCJjYWxsYmFjayIpP3QuY2FsbGJhY2s6bix0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1PYmplY3QuaGFzT3duKHQsIm90aGVyVHlwZUNhbGxiYWNrIik/dC5vdGhlclR5cGVDYWxsYmFjazp0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjayxpPU9iamVjdC5oYXNPd24odCwicGFyZW50Iik/dC5wYXJlbnQ6aSxvPU9iamVjdC5oYXNPd24odCwicGFyZW50UHJvcGVydHkiKT90LnBhcmVudFByb3BlcnR5Om8sdD10LnBhdGh9aWYoaT1pfHxudWxsLG89b3x8bnVsbCxBcnJheS5pc0FycmF5KHQpJiYodD0kLnRvUGF0aFN0cmluZyh0KSksIXQmJnQhPT0iInx8IWUpcmV0dXJuO2NvbnN0IGE9JC50b1BhdGhBcnJheSh0KTthWzBdPT09IiQiJiZhLmxlbmd0aD4xJiZhLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDtjb25zdCBmPXRoaXMuX3RyYWNlKGEsZSxbIiQiXSxpLG8sbikuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkJiYhZC5pc1BhcmVudFNlbGVjdG9yfSk7cmV0dXJuIGYubGVuZ3RoPyFoJiZmLmxlbmd0aD09PTEmJiFmWzBdLmhhc0FyckV4cHI/dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KGZbMF0pOmYucmVkdWNlKChkLF8pPT57Y29uc3QgUz10aGlzLl9nZXRQcmVmZXJyZWRPdXRwdXQoXyk7cmV0dXJuIHMmJkFycmF5LmlzQXJyYXkoUyk/ZD1kLmNvbmNhdChTKTpkLnB1c2goUyksZH0sW10pOmg/W106dm9pZCAwfSwkLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5jdXJyUmVzdWx0VHlwZTtzd2l0Y2goZSl7Y2FzZSJhbGwiOntjb25zdCBuPUFycmF5LmlzQXJyYXkodC5wYXRoKT90LnBhdGg6JC50b1BhdGhBcnJheSh0LnBhdGgpO3JldHVybiB0LnBvaW50ZXI9JC50b1BvaW50ZXIobiksdC5wYXRoPXR5cGVvZiB0LnBhdGg9PSJzdHJpbmciP3QucGF0aDokLnRvUGF0aFN0cmluZyh0LnBhdGgpLHR9Y2FzZSJ2YWx1ZSI6Y2FzZSJwYXJlbnQiOmNhc2UicGFyZW50UHJvcGVydHkiOnJldHVybiB0W2VdO2Nhc2UicGF0aCI6cmV0dXJuICQudG9QYXRoU3RyaW5nKHRbZV0pO2Nhc2UicG9pbnRlciI6cmV0dXJuICQudG9Qb2ludGVyKHQucGF0aCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHJlc3VsdCB0eXBlIil9fSwkLnByb3RvdHlwZS5faGFuZGxlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKGUpe2NvbnN0IHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6JC50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LCQucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLGgpe2xldCBhO2lmKCF0Lmxlbmd0aClyZXR1cm4gYT17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aSxoYXNBcnJFeHByOnN9LHRoaXMuX2hhbmRsZUNhbGxiYWNrKGEsbywidmFsdWUiKSxhO2NvbnN0IGY9dFswXSxkPXQuc2xpY2UoMSksXz1bXTtmdW5jdGlvbiBTKE8pe0FycmF5LmlzQXJyYXkoTyk/Ty5mb3JFYWNoKHc9PntfLnB1c2godyl9KTpfLnB1c2goTyl9aWYoKHR5cGVvZiBmIT0ic3RyaW5nInx8aCkmJmUmJk9iamVjdC5oYXNPd24oZSxmKSlTKHRoaXMuX3RyYWNlKGQsZVtmXSxKdChuLGYpLGUsZixvLHMpKTtlbHNlIGlmKGY9PT0iKiIpdGhpcy5fd2FsayhlLE89PntTKHRoaXMuX3RyYWNlKGQsZVtPXSxKdChuLE8pLGUsTyxvLCEwLCEwKSl9KTtlbHNlIGlmKGY9PT0iLi4iKVModGhpcy5fdHJhY2UoZCxlLG4scixpLG8scykpLHRoaXMuX3dhbGsoZSxPPT57dHlwZW9mIGVbT109PSJvYmplY3QiJiZTKHRoaXMuX3RyYWNlKHQuc2xpY2UoKSxlW09dLEp0KG4sTyksZSxPLG8sITApKX0pO2Vsc2V7aWYoZj09PSJeIilyZXR1cm4gdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9ITAse3BhdGg6bi5zbGljZSgwLC0xKSxleHByOmQsaXNQYXJlbnRTZWxlY3RvcjohMH07aWYoZj09PSJ+IilyZXR1cm4gYT17cGF0aDpKdChuLGYpLHZhbHVlOmkscGFyZW50OnIscGFyZW50UHJvcGVydHk6bnVsbH0sdGhpcy5faGFuZGxlQ2FsbGJhY2soYSxvLCJwcm9wZXJ0eSIpLGE7aWYoZj09PSIkIilTKHRoaXMuX3RyYWNlKGQsZSxuLG51bGwsbnVsbCxvLHMpKTtlbHNlIGlmKC9eKC0/XGQqKTooLT9cZCopOj8oXGQqKSQvdS50ZXN0KGYpKVModGhpcy5fc2xpY2UoZixkLGUsbixyLGksbykpO2Vsc2UgaWYoZi5pbmRleE9mKCI/KCIpPT09MCl7aWYodGhpcy5jdXJyRXZhbD09PSExKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7Y29uc3QgTz1mLnJlcGxhY2UoL15cP1woKC4qPylcKSQvdSwiJDEiKSx3PS9ALj8oW14/XSopW1snXShcPz9cKC4qP1wpKSg/IS5cKVxdKVtcXSddL2d1LmV4ZWMoTyk7dz90aGlzLl93YWxrKGUsYj0+e2NvbnN0IE09W3dbMl1dLG09d1sxXT9lW2JdW3dbMV1dOmVbYl07dGhpcy5fdHJhY2UoTSxtLG4scixpLG8sITApLmxlbmd0aD4wJiZTKHRoaXMuX3RyYWNlKGQsZVtiXSxKdChuLGIpLGUsYixvLCEwKSl9KTp0aGlzLl93YWxrKGUsYj0+e3RoaXMuX2V2YWwoTyxlW2JdLGIsbixyLGkpJiZTKHRoaXMuX3RyYWNlKGQsZVtiXSxKdChuLGIpLGUsYixvLCEwKSl9KX1lbHNlIGlmKGZbMF09PT0iKCIpe2lmKHRoaXMuY3VyckV2YWw9PT0hMSl0aHJvdyBuZXcgRXJyb3IoIkV2YWwgWyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7Uyh0aGlzLl90cmFjZSh0cih0aGlzLl9ldmFsKGYsZSxuLmF0KC0xKSxuLnNsaWNlKDAsLTEpLHIsaSksZCksZSxuLHIsaSxvLHMpKX1lbHNlIGlmKGZbMF09PT0iQCIpe2xldCBPPSExO2NvbnN0IHc9Zi5zbGljZSgxLC0yKTtzd2l0Y2godyl7Y2FzZSJzY2FsYXIiOighZXx8IVsib2JqZWN0IiwiZnVuY3Rpb24iXS5pbmNsdWRlcyh0eXBlb2YgZSkpJiYoTz0hMCk7YnJlYWs7Y2FzZSJib29sZWFuIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOmNhc2UiZnVuY3Rpb24iOnR5cGVvZiBlPT09dyYmKE89ITApO2JyZWFrO2Nhc2UiaW50ZWdlciI6TnVtYmVyLmlzRmluaXRlKGUpJiYhKGUlMSkmJihPPSEwKTticmVhaztjYXNlIm51bWJlciI6TnVtYmVyLmlzRmluaXRlKGUpJiYoTz0hMCk7YnJlYWs7Y2FzZSJub25GaW5pdGUiOnR5cGVvZiBlPT0ibnVtYmVyIiYmIU51bWJlci5pc0Zpbml0ZShlKSYmKE89ITApO2JyZWFrO2Nhc2Uib2JqZWN0IjplJiZ0eXBlb2YgZT09PXcmJihPPSEwKTticmVhaztjYXNlImFycmF5IjpBcnJheS5pc0FycmF5KGUpJiYoTz0hMCk7YnJlYWs7Y2FzZSJvdGhlciI6Tz10aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjayhlLG4scixpKTticmVhaztjYXNlIm51bGwiOmU9PT1udWxsJiYoTz0hMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHZhbHVlIHR5cGUgIit3KX1pZihPKXJldHVybiBhPXtwYXRoOm4sdmFsdWU6ZSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTppfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhhLG8sInZhbHVlIiksYX1lbHNlIGlmKGZbMF09PT0iYCImJmUmJk9iamVjdC5oYXNPd24oZSxmLnNsaWNlKDEpKSl7Y29uc3QgTz1mLnNsaWNlKDEpO1ModGhpcy5fdHJhY2UoZCxlW09dLEp0KG4sTyksZSxPLG8scywhMCkpfWVsc2UgaWYoZi5pbmNsdWRlcygiLCIpKXtjb25zdCBPPWYuc3BsaXQoIiwiKTtmb3IoY29uc3QgdyBvZiBPKVModGhpcy5fdHJhY2UodHIodyxkKSxlLG4scixpLG8sITApKX1lbHNlIWgmJmUmJk9iamVjdC5oYXNPd24oZSxmKSYmUyh0aGlzLl90cmFjZShkLGVbZl0sSnQobixmKSxlLGYsbyxzLCEwKSl9aWYodGhpcy5faGFzUGFyZW50U2VsZWN0b3IpZm9yKGxldCBPPTA7TzxfLmxlbmd0aDtPKyspe2NvbnN0IHc9X1tPXTtpZih3JiZ3LmlzUGFyZW50U2VsZWN0b3Ipe2NvbnN0IGI9dGhpcy5fdHJhY2Uody5leHByLGUsdy5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoYikpe19bT109YlswXTtjb25zdCBNPWIubGVuZ3RoO2ZvcihsZXQgbT0xO208TTttKyspTysrLF8uc3BsaWNlKE8sMCxiW21dKX1lbHNlIF9bT109Yn19cmV0dXJuIF99LCQucHJvdG90eXBlLl93YWxrPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj10Lmxlbmd0aDtmb3IobGV0IHI9MDtyPG47cisrKWUocil9ZWxzZSB0JiZ0eXBlb2YgdD09Im9iamVjdCImJk9iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e2Uobil9KX0sJC5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKCFBcnJheS5pc0FycmF5KG4pKXJldHVybjtjb25zdCBoPW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGY9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxO2xldCBkPWFbMF0mJk51bWJlci5wYXJzZUludChhWzBdKXx8MCxfPWFbMV0mJk51bWJlci5wYXJzZUludChhWzFdKXx8aDtkPWQ8MD9NYXRoLm1heCgwLGQraCk6TWF0aC5taW4oaCxkKSxfPV88MD9NYXRoLm1heCgwLF8raCk6TWF0aC5taW4oaCxfKTtjb25zdCBTPVtdO2ZvcihsZXQgTz1kO088XztPKz1mKXRoaXMuX3RyYWNlKHRyKE8sZSksbixyLGksbyxzLCEwKS5mb3JFYWNoKGI9PntTLnB1c2goYil9KTtyZXR1cm4gU30sJC5wcm90b3R5cGUuX2V2YWw9ZnVuY3Rpb24odCxlLG4scixpLG8pe3RoaXMuY3VyclNhbmRib3guXyRfcGFyZW50UHJvcGVydHk9byx0aGlzLmN1cnJTYW5kYm94Ll8kX3BhcmVudD1pLHRoaXMuY3VyclNhbmRib3guXyRfcHJvcGVydHk9bix0aGlzLmN1cnJTYW5kYm94Ll8kX3Jvb3Q9dGhpcy5qc29uLHRoaXMuY3VyclNhbmRib3guXyRfdj1lO2NvbnN0IHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPSQudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTtjb25zdCBoPXRoaXMuY3VyckV2YWwrIlNjcmlwdDoiK3Q7aWYoISQuY2FjaGVbaF0pe2xldCBhPXQucmVwbGFjZUFsbCgiQHBhcmVudFByb3BlcnR5IiwiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlQWxsKCJAcGFyZW50IiwiXyRfcGFyZW50IikucmVwbGFjZUFsbCgiQHByb3BlcnR5IiwiXyRfcHJvcGVydHkiKS5yZXBsYWNlQWxsKCJAcm9vdCIsIl8kX3Jvb3QiKS5yZXBsYWNlQWxsKC9AKFsuXHMpW10pL2d1LCJfJF92JDEiKTtpZihzJiYoYT1hLnJlcGxhY2VBbGwoIkBwYXRoIiwiXyRfcGF0aCIpKSx0aGlzLmN1cnJFdmFsPT09InNhZmUifHx0aGlzLmN1cnJFdmFsPT09ITB8fHRoaXMuY3VyckV2YWw9PT12b2lkIDApJC5jYWNoZVtoXT1uZXcgdGhpcy5zYWZlVm0uU2NyaXB0KGEpO2Vsc2UgaWYodGhpcy5jdXJyRXZhbD09PSJuYXRpdmUiKSQuY2FjaGVbaF09bmV3IHRoaXMudm0uU2NyaXB0KGEpO2Vsc2UgaWYodHlwZW9mIHRoaXMuY3VyckV2YWw9PSJmdW5jdGlvbiImJnRoaXMuY3VyckV2YWwucHJvdG90eXBlJiZPYmplY3QuaGFzT3duKHRoaXMuY3VyckV2YWwucHJvdG90eXBlLCJydW5Jbk5ld0NvbnRleHQiKSl7Y29uc3QgZj10aGlzLmN1cnJFdmFsOyQuY2FjaGVbaF09bmV3IGYoYSl9ZWxzZSBpZih0eXBlb2YgdGhpcy5jdXJyRXZhbD09ImZ1bmN0aW9uIikkLmNhY2hlW2hdPXtydW5Jbk5ld0NvbnRleHQ6Zj0+dGhpcy5jdXJyRXZhbChhLGYpfTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gImV2YWwiIHByb3BlcnR5ICIke3RoaXMuY3VyckV2YWx9ImApfXRyeXtyZXR1cm4gJC5jYWNoZVtoXS5ydW5Jbk5ld0NvbnRleHQodGhpcy5jdXJyU2FuZGJveCl9Y2F0Y2goYSl7aWYodGhpcy5pZ25vcmVFdmFsRXJyb3JzKXJldHVybiExO3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrYS5tZXNzYWdlKyI6ICIrdCl9fSwkLmNhY2hlPXt9LCQudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dCxuPWUubGVuZ3RoO2xldCByPSIkIjtmb3IobGV0IGk9MTtpPG47aSsrKS9eKH58XF58QC4qP1woXCkpJC91LnRlc3QoZVtpXSl8fChyKz0vXlswLTkqXSskL3UudGVzdChlW2ldKT8iWyIrZVtpXSsiXSI6IlsnIitlW2ldKyInXSIpO3JldHVybiByfSwkLnRvUG9pbnRlcj1mdW5jdGlvbih0KXtjb25zdCBlPXQsbj1lLmxlbmd0aDtsZXQgcj0iIjtmb3IobGV0IGk9MTtpPG47aSsrKS9eKH58XF58QC4qP1woXCkpJC91LnRlc3QoZVtpXSl8fChyKz0iLyIrZVtpXS50b1N0cmluZygpLnJlcGxhY2VBbGwoIn4iLCJ+MCIpLnJlcGxhY2VBbGwoIi8iLCJ+MSIpKTtyZXR1cm4gcn0sJC50b1BhdGhBcnJheT1mdW5jdGlvbih0KXtjb25zdHtjYWNoZTplfT0kO2lmKGVbdF0pcmV0dXJuIGVbdF0uY29uY2F0KCk7Y29uc3Qgbj1bXSxpPXQucmVwbGFjZUFsbCgvQCg/Om51bGx8Ym9vbGVhbnxudW1iZXJ8c3RyaW5nfGludGVnZXJ8dW5kZWZpbmVkfG5vbkZpbml0ZXxzY2FsYXJ8YXJyYXl8b2JqZWN0fGZ1bmN0aW9ufG90aGVyKVwoXCkvZ3UsIjskJjsiKS5yZXBsYWNlQWxsKC9bWyddKFw/P1woLio/XCkpW1xdJ10oPyEuXF0pL2d1LGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2VBbGwoL1xbWyciXShbXidcXV0qKVsnIl1cXS9ndSxmdW5jdGlvbihvLHMpe3JldHVybiJbJyIrcy5yZXBsYWNlQWxsKCIuIiwiJUAlIikucmVwbGFjZUFsbCgifiIsIiUlQEAlJSIpKyInXSJ9KS5yZXBsYWNlQWxsKCJ+IiwiO347IikucmVwbGFjZUFsbCgvWyciXT9cLlsnIl0/KD8hW15bXSpcXSl8XFtbJyJdPy9ndSwiOyIpLnJlcGxhY2VBbGwoIiVAJSIsIi4iKS5yZXBsYWNlQWxsKCIlJUBAJSUiLCJ+IikucmVwbGFjZUFsbCgvKD86Oyk/KFxeKykoPzo7KT8vZ3UsZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2VBbGwoLzs7O3w7Oy9ndSwiOy4uOyIpLnJlcGxhY2VBbGwoLzskfCc/XF18JyQvZ3UsIiIpLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKG8pe2NvbnN0IHM9by5tYXRjaCgvIyhcZCspL3UpO3JldHVybiFzfHwhc1sxXT9vOm5bc1sxXV19KTtyZXR1cm4gZVt0XT1pLGVbdF0uY29uY2F0KCl9LCQucHJvdG90eXBlLnNhZmVWbT17U2NyaXB0OmdmfTtjb25zdCBTZj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj10Lmxlbmd0aDtmb3IobGV0IGk9MDtpPHI7aSsrKXtjb25zdCBvPXRbaV07bihvKSYmZS5wdXNoKHQuc3BsaWNlKGktLSwxKVswXSl9fTtjbGFzcyB3Zntjb25zdHJ1Y3RvcihlKXt0aGlzLmNvZGU9ZX1ydW5Jbk5ld0NvbnRleHQoZSl7bGV0IG49dGhpcy5jb2RlO2NvbnN0IHI9T2JqZWN0LmtleXMoZSksaT1bXTtTZihyLGksZj0+dHlwZW9mIGVbZl09PSJmdW5jdGlvbiIpO2NvbnN0IG89ci5tYXAoZj0+ZVtmXSk7bj1pLnJlZHVjZSgoZixkKT0+e2xldCBfPWVbZF0udG9TdHJpbmcoKTtyZXR1cm4vZnVuY3Rpb24vdS50ZXN0KF8pfHwoXz0iZnVuY3Rpb24gIitfKSwidmFyICIrZCsiPSIrXysiOyIrZn0sIiIpK24sIS8oWyciXSl1c2Ugc3RyaWN0XDEvdS50ZXN0KG4pJiYhci5pbmNsdWRlcygiYXJndW1lbnRzIikmJihuPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrbiksbj1uLnJlcGxhY2UoLztccyokL3UsIiIpO2NvbnN0IGg9bi5sYXN0SW5kZXhPZigiOyIpLGE9aCE9PS0xP24uc2xpY2UoMCxoKzEpKyIgcmV0dXJuICIrbi5zbGljZShoKzEpOiIgcmV0dXJuICIrbjtyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLnIsYSkoLi4ubyl9fSQucHJvdG90eXBlLnZtPXtTY3JpcHQ6d2Z9O2NvbnN0IElmPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSIsQ2Y9dD0+QXJyYXkuZnJvbSh3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSh0KSkpLm1hcChlPT5JZltlJXRdKS5qb2luKCIiKS50b0xvd2VyQ2FzZSgpLHdpPXQ9PntpZih0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiB0O2Zvcihjb25zdCBlIGluIHQpaWYodHlwZW9mIHRbZV09PSJzdHJpbmciKXRyeXt0W2VdLnN0YXJ0c1dpdGgoInsiKSYmdFtlXS5lbmRzV2l0aCgifSIpJiYodFtlXT1KU09OLnBhcnNlKHRbZV0pKX1jYXRjaHtjb25zb2xlLmVycm9yKCJJbnZhbGlkIEpTT046Iix0W2VdKX1lbHNlIHR5cGVvZiB0W2VdPT0ib2JqZWN0IiYmKHRbZV09d2kodFtlXSkpO3JldHVybiB0fSxlcj0iY3ptXyI7ZnVuY3Rpb24gTmYodCxlKXtsZXQgbj10LHI9IiI7Y29uc3QgaT1bXTtsZXQgbz1uLmluZGV4T2YoIiR7Iik7Y29uc3Qgcz10eXBlb2YgZTwidSIsaD17fSxhPS9eXCQuLztmb3IoO28+PTA7KWlmKE1mKG4sbykpe2NvbnN0IGY9RmYobixvKTtyKz1uLnNsaWNlKDAsZisxKSxuPW4uc2xpY2UoZisxKSxvPW4uaW5kZXhPZigiJHsiKX1lbHNle3IrPW4uc2xpY2UoMCxvKTtjb25zdCBmPUxmKG4sbyksZD1uLnNsaWNlKG8rMixmKTtpZihhLnRlc3QoZCkpe2lmKCFzKXJldHVybltyLFtdXTtsZXQgXz1oW2RdO2lmKCFfKXRyeXtfPSQoe2pzb246ZSxwYXRoOmR9KSxoW2RdPV99Y2F0Y2h7cmV0dXJuW3IsW11dfWlmKF8ubGVuZ3RoIT09MCl7Y29uc3QgUz1DZigxMCk7aS5wdXNoKHtsaXRlcmFsTmFtZTpTLGxpdGVyYWxWYWx1ZTpfWzBdfSkscis9U31lbHNlIHJldHVyblsiZmFsc2UiLFtdXX1lbHNle2NvbnN0IF89UGYoZCk7cis9YCR7ZXJ9JHtffWB9bj1uLnNsaWNlKGYrMSksbz1uLmluZGV4T2YoIiR7Iil9cmV0dXJuIHIrPW4sW3IsaV19ZnVuY3Rpb24gTWYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk+PWU6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKT49ZTohMX1mdW5jdGlvbiBGZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCInIikscj10LmluZGV4T2YoJyInKTtyZXR1cm4gbj49MCYmbjxlP3QuaW5kZXhPZigiJyIsbisxKTpyPj0wJiZyPGU/dC5pbmRleE9mKCciJyxyKzEpOi0xfWZ1bmN0aW9uIExmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIn0iLGUpO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoInJlcGxhY2VWYXJpYWJsZTogVW5tYXRjaGVkIHsuIik7cmV0dXJuIG59Y29uc3QgdWU9dD0+YCRyZWVhcnRoXyR7dH1fJGAsbnI9eyJbIjp1ZSgib3BlbmVkX3NxdWFyZV9icmFja2V0IiksIl0iOnVlKCJjbG9zZWRfc3F1YXJlX2JyYWNrZXQiKSwieyI6dWUoIm9wZW5lZF9jdXJseV9icmFja2V0IiksIn0iOnVlKCJjbG9zZWRfY3VybHlfYnJhY2tldCIpLCIoIjp1ZSgib3BlbmVkX3BhcmVudGhlc2VzIiksIikiOnVlKCJjbG9zZWRfcGFyZW50aGVzZXMiKSwiLSI6dWUoImh5cGhlbiIpfSxQZj10PT57Y29uc3QgZT10LnJlcGxhY2UoLy0vZyxuclsiLSJdKTtyZXR1cm4vKFxdfFwpfFx9KVteWy5dKyQvLnRlc3QoZSk/T2JqZWN0LmVudHJpZXMobnIpLnJlZHVjZSgobixbcixpXSk9Pm4ucmVwbGFjZUFsbChyLGkpLGUpOmV9LHZmPXQ9Pk9iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKGUsW24scl0pPT5lLnJlcGxhY2VBbGwocixuKSx0KSxEZj1uZXcgU2V0KFp1KSxJaT1uZXcgU2V0KFF1KTtmdW5jdGlvbiBWKHQsZSl7bGV0IG49bmV3IEVycm9yKCJmYWlsZWQgdG8gcGFyc2UiKTtjb25zdCByPWUudHlwZTtpZihyPT09IkxpdGVyYWwiKW49QmYoZSk7ZWxzZSBpZihyPT09IkNhbGxFeHByZXNzaW9uIiluPWpmKHQsZSk7ZWxzZSBpZihyPT09IklkZW50aWZpZXIiKW49R2YoZSk7ZWxzZSBpZihyPT09IlVuYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVYodCxlLmFyZ3VtZW50KTtpZihEZi5oYXMoaSkpbj1uZXcgRChGLlVOQVJZLGksbyk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0b3IgIiR7aX0iLmApfWVsc2UgaWYocj09PSJCaW5hcnlFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vih0LGUubGVmdCkscz1WKHQsZS5yaWdodCk7aWYoSWkuaGFzKGkpKW49bmV3IEQoRi5CSU5BUlksaSxvLHMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iTG9naWNhbEV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1WKHQsZS5sZWZ0KSxzPVYodCxlLnJpZ2h0KTtJaS5oYXMoaSkmJihuPW5ldyBEKEYuQklOQVJZLGksbyxzKSl9ZWxzZSBpZihyPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIpe2NvbnN0IGk9Vih0LGUudGVzdCksbz1WKHQsZS5jb25zZXF1ZW50KSxzPVYodCxlLmFsdGVybmF0ZSk7bj1uZXcgRChGLkNPTkRJVElPTkFMLCI/IixvLHMsaSl9ZWxzZSBpZihyPT09Ik1lbWJlckV4cHJlc3Npb24iKW49VmYodCxlKTtlbHNlIGlmKHI9PT0iQXJyYXlFeHByZXNzaW9uIil7Y29uc3QgaT1bXTtmb3IobGV0IG89MDtvPGUuZWxlbWVudHMubGVuZ3RoO28rKylpW29dPVYodCxlLmVsZW1lbnRzW29dKTtuPW5ldyBEKEYuQVJSQVksaSl9ZWxzZSB0aHJvdyByPT09IkNvbXBvdW5kIj9uZXcgRXJyb3IoIlByb3ZpZGUgZXhhY3RseSBvbmUgZXhwcmVzc2lvbi4iKTpuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBleHByZXNzaW9uLiIpO3JldHVybiBufWZ1bmN0aW9uIEJmKHQpe2NvbnN0IGU9dHlwZW9mIHQudmFsdWU7aWYodC52YWx1ZT09PW51bGwpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVUxMLG51bGwpO2lmKGU9PT0iYm9vbGVhbiIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9CT09MRUFOLHQudmFsdWUpO2lmKGU9PT0ibnVtYmVyIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUix0LnZhbHVlKTtpZihlPT09InN0cmluZyIpcmV0dXJuIHQudmFsdWUuaW5kZXhPZigiJHsiKT49MD9uZXcgRChGLlZBUklBQkxFX0lOX1NUUklORyx0LnZhbHVlKTpuZXcgRChGLkxJVEVSQUxfU1RSSU5HLFVmKHQudmFsdWUpKTt0aHJvdyBuZXcgRXJyb3IoYCR7dH0gaXMgbm90IGEgZnVuY3Rpb24uYCl9ZnVuY3Rpb24gVWYodCl7cmV0dXJuIHQucmVwbGFjZShlZiwiXFwiKX1mdW5jdGlvbiBqZih0LGUpe2NvbnN0IG49ZS5hcmd1bWVudHMscj1uLmxlbmd0aDtpZihlLmNhbGxlZS50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iKXtjb25zdCBvPWUuY2FsbGVlLnByb3BlcnR5Lm5hbWUscz1lLmNhbGxlZS5vYmplY3Q7aWYobz09PSJ0ZXN0Inx8bz09PSJleGVjIil7aWYocy5jYWxsZWUubmFtZSE9PSJyZWdFeHAiKXRocm93IG5ldyBFcnJvcihgJHtvfSBpcyBub3QgYSBmdW5jdGlvbi5gKTtpZihyPT09MClyZXR1cm4gbz09PSJ0ZXN0Ij9uZXcgRChGLkxJVEVSQUxfQk9PTEVBTiwhMSk6bmV3IEQoRi5MSVRFUkFMX05VTEwsbnVsbCk7Y29uc3QgaD1WKHQscyksYT1WKHQsblswXSk7cmV0dXJuIG5ldyBEKEYuRlVOQ1RJT05fQ0FMTCxvLGgsYSl9ZWxzZSBpZihvPT09InRvU3RyaW5nIil7Y29uc3QgaD1WKHQscyk7cmV0dXJuIG5ldyBEKEYuRlVOQ1RJT05fQ0FMTCxvLGgpfXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke299Ii5gKX1jb25zdCBpPWUuY2FsbGVlLm5hbWU7aWYoaT09PSJjb2xvciIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfQ09MT1IsaSk7Y29uc3Qgbz1WKHQsblswXSk7aWYodHlwZW9mIG5bMV08InUiKXtjb25zdCBzPVYodCxuWzFdKTtyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0NPTE9SLGksW28sc10pfXJldHVybiBuZXcgRChGLkxJVEVSQUxfQ09MT1IsaSxbb10pfWVsc2UgaWYoaT09PSJyZ2IifHxpPT09ImhzbCIpe2lmKHI8Myl0aHJvdyBuZXcgRXJyb3IoYCR7aX0gcmVxdWlyZXMgdGhyZWUgYXJndW1lbnRzLmApO2NvbnN0IG89W1YodCxuWzBdKSxWKHQsblsxXSksVih0LG5bMl0pXTtyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0NPTE9SLGksbyl9ZWxzZSBpZihpPT09InJnYmEifHxpPT09ImhzbGEiKXtpZihyPDQpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGZvdXIgYXJndW1lbnRzLmApO2NvbnN0IG89W1YodCxuWzBdKSxWKHQsblsxXSksVih0LG5bMl0pLFYodCxuWzNdKV07cmV0dXJuIG5ldyBEKEYuTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJpc05hTiJ8fGk9PT0iaXNGaW5pdGUiKXtpZihyPT09MClyZXR1cm4gaT09PSJpc05hTiI/bmV3IEQoRi5MSVRFUkFMX0JPT0xFQU4sITApOm5ldyBEKEYuTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVYodCxuWzBdKTtyZXR1cm4gbmV3IEQoRi5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIFpuW2ldPCJ1Iil7aWYociE9PTEpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LmApO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZih0eXBlb2YgWW5baV08InUiKXtpZihyIT09Mil0aHJvdyBuZXcgRXJyb3IoYCR7aX0gcmVxdWlyZXMgZXhhY3RseSB0d28gYXJndW1lbnRzLmApO2NvbnN0IG89Vih0LG5bMF0pLHM9Vih0LG5bMV0pO3JldHVybiBuZXcgRChGLkJJTkFSWSxpLG8scyl9ZWxzZSBpZihpPT09IkJvb2xlYW4iKXtpZihyPT09MClyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0JPT0xFQU4sITEpO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZihpPT09Ik51bWJlciIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfTlVNQkVSLDApO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZihpPT09IlN0cmluZyIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfU1RSSU5HLCIiKTtjb25zdCBvPVYodCxuWzBdKTtyZXR1cm4gbmV3IEQoRi5VTkFSWSxpLG8pfXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke2l9Ii5gKX1mdW5jdGlvbiBHZih0KXtjb25zdCBlPXQubmFtZTtpZihYZihlKSl7Y29uc3Qgbj1XZihlKTtyZXR1cm4gbi5zdWJzdHJpbmcoMCw4KT09PSJ0aWxlczNkXyI/bmV3IEQoRi5CVUlMVElOX1ZBUklBQkxFLG4pOm5ldyBEKEYuVkFSSUFCTEUsbil9ZWxzZXtpZihlPT09Ik5hTiIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVU1CRVIsTmFOKTtpZihlPT09IkluZmluaXR5IilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUiwxLzApO2lmKGU9PT0idW5kZWZpbmVkIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX1VOREVGSU5FRCx2b2lkIDApfXRocm93IG5ldyBFcnJvcihgJHtlfSBpcyBub3QgZGVmaW5lZC5gKX1mdW5jdGlvbiAkZih0KXtjb25zdCBlPXQucHJvcGVydHkubmFtZTtpZihlPT09IlBJIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUixNYXRoLlBJKTtpZihlPT09IkUiKXJldHVybiBuZXcgRChGLkxJVEVSQUxfTlVNQkVSLE1hdGguRSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE1hdGggQ29uc3RhbnQgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50YCl9ZnVuY3Rpb24ga2YodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQT1NJVElWRV9JTkZJTklUWSIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVU1CRVIsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gTnVtYmVyIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIFZmKHQsZSl7aWYoZS5vYmplY3QubmFtZT09PSJNYXRoIilyZXR1cm4gJGYoZSk7aWYoZS5vYmplY3QubmFtZT09PSJOdW1iZXIiKXJldHVybiBrZihlKTtsZXQgbjtjb25zdCByPVYodCxlLm9iamVjdCk7cmV0dXJuIGUuY29tcHV0ZWQ/KG49Vih0LGUucHJvcGVydHkpLG5ldyBEKEYuTUVNQkVSLCJicmFja2V0cyIscixuKSk6KG49bmV3IEQoRi5MSVRFUkFMX1NUUklORyxlLnByb3BlcnR5Lm5hbWUpLG5ldyBEKEYuTUVNQkVSLCJkb3QiLHIsbikpfWZ1bmN0aW9uIFhmKHQpe3JldHVybiB0LnN1YnN0cmluZygwLDQpPT09ZXJ9ZnVuY3Rpb24gV2YodCl7cmV0dXJuIHZmKHQpLnN1YnN0cmluZyg0KX1jb25zdCBDaT1uZXcgTWFwLE5pPW5ldyBNYXAsTWk9bmV3IE1hcCxGaT1uZXcgTWFwO2NsYXNzIGZue2NvbnN0cnVjdG9yKGUsbixyKXtMKHRoaXMsIl9ydW50aW1lQXN0Iik7TCh0aGlzLCJfZmVhdHVyZSIpO3ZhciBoO3RoaXMuX2ZlYXR1cmU9bjtsZXQgaT1bXTtlPXpmKGUscik7Y29uc3Qgbz1OaS5nZXQoZSk7aWYobylbZSxpXT1vO2Vsc2V7Y29uc3QgYT1lO1tlLGldPU5mKEhmKGUpLChoPXRoaXMuX2ZlYXR1cmUpPT1udWxsP3ZvaWQgMDpoLnByb3BlcnRpZXMpLGUuaW5jbHVkZXMoZXIpJiZOaS5zZXQoYSxbZSxpXSl9Y29uc3Qgcz1DaS5nZXQoZSk7aWYocyl0aGlzLl9ydW50aW1lQXN0PXM7ZWxzZXtpZihpLmxlbmd0aCE9PTApZm9yKGNvbnN0IGYgb2YgaSlRdC5hZGRMaXRlcmFsKGYubGl0ZXJhbE5hbWUsZi5saXRlcmFsVmFsdWUpO1F0LmFkZEJpbmFyeU9wKCI9fiIsMCksUXQuYWRkQmluYXJ5T3AoIiF+IiwwKTtsZXQgYTt0cnl7YT1RdChlKX1jYXRjaChmKXt0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBnZW5lcmF0ZSBhc3Q6ICR7Zn1gKX10aGlzLl9ydW50aW1lQXN0PVYodGhpcyxhKSxDaS5zZXQoZSx0aGlzLl9ydW50aW1lQXN0KX19ZXZhbHVhdGUoKXtyZXR1cm4gdGhpcy5fcnVudGltZUFzdC5ldmFsdWF0ZSh0aGlzLl9mZWF0dXJlKX19ZnVuY3Rpb24gemYodCxlKXtpZih0eXBlb2YgZT4idSIpcmV0dXJuIHQ7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShPYmplY3QuZW50cmllcyhlKS5zb3J0KCkpLHI9dCtuLGk9RmkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7bGV0IG89TWkuZ2V0KHQpO298fChvPW5ldyBSZWdFeHAoYFxcJFxceygke09iamVjdC5rZXlzKGUpLmpvaW4oInwiKX0pXFx9YCwiZyIpLE1pLnNldCh0LG8pKTtjb25zdCBzPXQucmVwbGFjZShvLChoLGEpPT50eXBlb2YgZVthXTwidSI/YCgke2VbYV19KWA6IiIpO3JldHVybiBGaS5zZXQocixzKSxzfWZ1bmN0aW9uIEhmKHQpe3JldHVybiB0LnJlcGxhY2UoSnUsdGYpfWNsYXNzIHFme2NvbnN0cnVjdG9yKGUsbixyKXtMKHRoaXMsIl9jb25kaXRpb25zIik7TCh0aGlzLCJfcnVudGltZUNvbmRpdGlvbnMiKTtMKHRoaXMsIl9mZWF0dXJlIik7TCh0aGlzLCJfbWVtb2l6ZWRSZXN1bHQiKTt0aGlzLl9jb25kaXRpb25zPWUuY29uZGl0aW9ucyx0aGlzLl9ydW50aW1lQ29uZGl0aW9ucz1bXSx0aGlzLl9mZWF0dXJlPW4sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwLHRoaXMuc2V0UnVudGltZShyKX1zZXRSdW50aW1lKGUpe3ZhciByO2NvbnN0IG49KHI9dGhpcy5fY29uZGl0aW9ucyk9PW51bGw/dm9pZCAwOnIubWFwKGk9Pntjb25zdCBvPVN0cmluZyhpWzBdKSxzPVN0cmluZyhpWzFdKTtyZXR1cm4gbmV3IEtmKG5ldyBmbihvLHRoaXMuX2ZlYXR1cmUsZSksbmV3IGZuKHMsdGhpcy5fZmVhdHVyZSxlKSl9KTt0aGlzLl9ydW50aW1lQ29uZGl0aW9ucz1uPz9bXSx0aGlzLl9tZW1vaXplZFJlc3VsdD12b2lkIDB9ZXZhbHVhdGUoKXtpZih0eXBlb2YgdGhpcy5fbWVtb2l6ZWRSZXN1bHQ8InUiKXJldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdDtjb25zdCBlPXRoaXMuX3J1bnRpbWVDb25kaXRpb25zLG49ZS5sZW5ndGg7Zm9yKGxldCBpPTA7aTxuO2krKyl7Y29uc3Qgbz1lW2ldO2lmKG8uY29uZGl0aW9uLmV2YWx1YXRlKCkpe2NvbnN0IHM9by5leHByZXNzaW9uLmV2YWx1YXRlKCk7cmV0dXJuIHRoaXMuX21lbW9pemVkUmVzdWx0PXMsc319Y29uc3Qgcj12b2lkIDA7cmV0dXJuIHRoaXMuX21lbW9pemVkUmVzdWx0PXIscn19Y2xhc3MgS2Z7Y29uc3RydWN0b3IoZSxuKXtMKHRoaXMsImNvbmRpdGlvbiIpO0wodGhpcywiZXhwcmVzc2lvbiIpO3RoaXMuY29uZGl0aW9uPWUsdGhpcy5leHByZXNzaW9uPW59fWNvbnN0IFlmPSh0LGUsbik9Pntjb25zdCByPUJ1KHQsWHUpLGk9ZWwodCxlKTtyZXR1cm57Li4uaSwuLi5aZihyLHQsaSksdHlwZToiY29tcHV0ZWRGZWF0dXJlIixpbnRlcnZhbDpufX07ZnVuY3Rpb24gWmYodCxlLG4pe2lmKCFuKXtpZighZS5pZCl0aHJvdyBuZXcgRXJyb3IoImxheWVyIGlkIGlzIHJlcXVpcmVkIik7bj17dHlwZToiZmVhdHVyZSIsaWQ6ZS5pZCxwcm9wZXJ0aWVzOmUucHJvcGVydGllc3x8e319fXJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9Pmk/W3IsTGkoaSxlLG4pXTp2b2lkIDApLmZpbHRlcihyPT4hIXIpKX1mdW5jdGlvbiBMaSh0LGUsbil7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoKFtyLGldKT0+SmYoaSk/W3IsTGkoaSxlLG4pXTpbcix0bChpLGUsbildKSl9ZnVuY3Rpb24gUWYodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmImV4cHJlc3Npb24iaW4gdH1mdW5jdGlvbiBKZih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0JiYhKCJleHByZXNzaW9uImluIHQpJiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB0bCh0LGUsbil7dHJ5e2lmKFFmKHQpKXtjb25zdCByPXQuZXhwcmVzc2lvbixpPXdpKEN1KG4pKTtyZXR1cm4gdHlwZW9mIHI+InUiP3ZvaWQgMDp0eXBlb2Ygcj09Im9iamVjdCImJnIuY29uZGl0aW9ucz9uZXcgcWYocixpLGUuZGVmaW5lcykuZXZhbHVhdGUoKTp0eXBlb2Ygcj09ImJvb2xlYW4ifHx0eXBlb2Ygcj09Im51bWJlciI/bmV3IGZuKFN0cmluZyhyKSxpLGUuZGVmaW5lcykuZXZhbHVhdGUoKTp0eXBlb2Ygcj09InN0cmluZyI/bmV3IGZuKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6cn1yZXR1cm4gdH1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpO3JldHVybn19ZnVuY3Rpb24gZWwodCxlKXt2YXIgaTtjb25zdCBuPShpPXQuZGF0YSk9PW51bGw/dm9pZCAwOmkuanNvblByb3BlcnRpZXM7aWYoIWUucHJvcGVydGllc3x8IW58fCFuLmxlbmd0aClyZXR1cm4gZTtjb25zdCByPXsuLi5lLC4uLmUhPW51bGwmJmUucHJvcGVydGllcz97cHJvcGVydGllczp7Li4uZS5wcm9wZXJ0aWVzfX06e319O3JldHVybiBuLmZvckVhY2gobz0+e3IucHJvcGVydGllc1tvXT0oKCk9Pntjb25zdCBzPXIucHJvcGVydGllc1tvXTt0cnl7cmV0dXJuIEpTT04ucGFyc2Uocyl9Y2F0Y2h7cmV0dXJuIHN9fSkoKX0pLHJ9ZnVuY3Rpb24gbG4odCxlKXtpZih0LnR5cGU9PT0ic2ltcGxlIilyZXR1cm4gWWYodCxlKX1jb25zdCBubD0odCxlLG4pPT57aWYoIW4pcmV0dXJuO2NvbnN0IHI9KCgpPT57c3dpdGNoKFh0LnR5cGVzW3QudHlwZV0pe2Nhc2UiUG9seWdvbiI6cmV0dXJuInBvbHlnb24iO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuInBvbHlsaW5lIjtjYXNlIlBvaW50IjpyZXR1cm4ibWFya2VyIjtkZWZhdWx0OnJldHVybn19KSgpO2lmKCFyKXJldHVybjtjb25zdCBpPXQuaWQ/U3RyaW5nKHQuaWQpOnJsKHQubG9hZEdlb21ldHJ5KCksZSksbz1sbihuLGlsKGksdCxlLHIpKSxzPW5ldyBTbjtyZXR1cm4gcy5kYXRhPXtsYXllcklkOm49PW51bGw/dm9pZCAwOm4uaWQsZmVhdHVyZUlkOmksZmVhdHVyZTpvLGFwcGVhcmFuY2VUeXBlOlh0LnR5cGVzW3QudHlwZV0udG9Mb3dlckNhc2UoKX0sc30scmw9KHQsZSk9Pntjb25zdCBuPVtlLngsZS55LGUubGV2ZWwsLi4udC5mbGF0TWFwKHI9PnIubWFwKGk9PltpLngsaS55XSkpXS5qb2luKCI6Iik7cmV0dXJuIFZ1KG4pfSxpbD0odCxlLG4scik9Pntjb25zdCBpPWUubG9hZEdlb21ldHJ5KCksW28sc109KCgpPT57aWYocj09PSJwb2x5Z29uIilyZXR1cm5bIlBvbHlnb24iLGkubWFwKGg9PmgubWFwKGE9PlthLngsYS55XSkpXTtpZihyPT09InBvbHlsaW5lIilyZXR1cm5bIkxpbmVTdHJpbmciLGlbMF0ubWFwKGg9PltoLngsaC55XSldO2lmKHI9PT0ibWFya2VyIilyZXR1cm5bIlBvaW50IixbaVswXVswXS54LGlbMF1bMF0ueV1dO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcHBlYXJhbmNlICR7cn1gKX0pKCk7cmV0dXJue3R5cGU6ImZlYXR1cmUiLGlkOnQsZ2VvbWV0cnk6e3R5cGU6byxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOmUucHJvcGVydGllcyxyYW5nZTp7eDpuLngseTpuLnksejpuLmxldmVsfX19LEllPXR5cGVvZiBwZXJmb3JtYW5jZT09Im9iamVjdCImJnBlcmZvcm1hbmNlJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iP3BlcmZvcm1hbmNlOkRhdGUsUGk9bmV3IFNldCxycj10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnByb2Nlc3M/cHJvY2Vzczp7fSx2aT0odCxlLG4scik9Pnt0eXBlb2YgcnIuZW1pdFdhcm5pbmc9PSJmdW5jdGlvbiI/cnIuZW1pdFdhcm5pbmcodCxlLG4scik6Y29uc29sZS5lcnJvcihgWyR7bn1dICR7ZX06ICR7dH1gKX07bGV0IGRuPWdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyLERpPWdsb2JhbFRoaXMuQWJvcnRTaWduYWw7aWYodHlwZW9mIGRuPiJ1Iil7RGk9Y2xhc3N7Y29uc3RydWN0b3IoKXtMKHRoaXMsIm9uYWJvcnQiKTtMKHRoaXMsIl9vbmFib3J0IixbXSk7TCh0aGlzLCJyZWFzb24iKTtMKHRoaXMsImFib3J0ZWQiLCExKX1hZGRFdmVudExpc3RlbmVyKHIsaSl7dGhpcy5fb25hYm9ydC5wdXNoKGkpfX0sZG49Y2xhc3N7Y29uc3RydWN0b3IoKXtMKHRoaXMsInNpZ25hbCIsbmV3IERpKTtlKCl9YWJvcnQocil7dmFyIGksbztpZighdGhpcy5zaWduYWwuYWJvcnRlZCl7dGhpcy5zaWduYWwucmVhc29uPXIsdGhpcy5zaWduYWwuYWJvcnRlZD0hMDtmb3IoY29uc3QgcyBvZiB0aGlzLnNpZ25hbC5fb25hYm9ydClzKHIpOyhvPShpPXRoaXMuc2lnbmFsKS5vbmFib3J0KT09bnVsbHx8by5jYWxsKGkscil9fX07bGV0IHQ9KChraT1yci5lbnYpPT1udWxsP3ZvaWQgMDpraS5MUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkcpIT09IjEiO2NvbnN0IGU9KCk9Pnt0JiYodD0hMSx2aSgiQWJvcnRDb250cm9sbGVyIGlzIG5vdCBkZWZpbmVkLiBJZiB1c2luZyBscnUtY2FjaGUgaW4gbm9kZSAxNCwgbG9hZCBhbiBBYm9ydENvbnRyb2xsZXIgcG9seWZpbGwgZnJvbSB0aGUgYG5vZGUtYWJvcnQtY29udHJvbGxlcmAgcGFja2FnZS4gQSBtaW5pbWFsIHBvbHlmaWxsIGlzIHByb3ZpZGVkIGZvciB1c2UgYnkgTFJVQ2FjaGUuZmV0Y2goKSwgYnV0IGl0IHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24gaW4gb3RoZXIgY29udGV4dHMgKGVnLCBwYXNzaW5nIGl0IHRvIG90aGVyIEFQSXMgdGhhdCB1c2UgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cykuIFlvdSBtYXkgZGlzYWJsZSB0aGlzIHdpdGggTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HPTEgaW4gdGhlIGVudi4iLCJOT19BQk9SVF9DT05UUk9MTEVSIiwiRU5PVFNVUCIsZSkpfX1jb25zdCBvbD10PT4hUGkuaGFzKHQpLHRlPXQ9PnQmJnQ9PT1NYXRoLmZsb29yKHQpJiZ0PjAmJmlzRmluaXRlKHQpLEJpPXQ9PnRlKHQpP3Q8PU1hdGgucG93KDIsOCk/VWludDhBcnJheTp0PD1NYXRoLnBvdygyLDE2KT9VaW50MTZBcnJheTp0PD1NYXRoLnBvdygyLDMyKT9VaW50MzJBcnJheTp0PD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUj9FbjpudWxsOm51bGw7Y2xhc3MgRW4gZXh0ZW5kcyBBcnJheXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmZpbGwoMCl9fWNvbnN0IE5lPWNsYXNze2NvbnN0cnVjdG9yKGUsbil7TCh0aGlzLCJoZWFwIik7TCh0aGlzLCJsZW5ndGgiKTtpZighYyhOZSxDZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5zdGFudGlhdGUgU3RhY2sgdXNpbmcgU3RhY2suY3JlYXRlKG4pIik7dGhpcy5oZWFwPW5ldyBuKGUpLHRoaXMubGVuZ3RoPTB9c3RhdGljIGNyZWF0ZShlKXtjb25zdCBuPUJpKGUpO2lmKCFuKXJldHVybltdO1AoTmUsQ2UsITApO2NvbnN0IHI9bmV3IE5lKGUsbik7cmV0dXJuIFAoTmUsQ2UsITEpLHJ9cHVzaChlKXt0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK109ZX1wb3AoKXtyZXR1cm4gdGhpcy5oZWFwWy0tdGhpcy5sZW5ndGhdfX07bGV0IF9uPU5lO0NlPW5ldyBXZWFrTWFwLEIoX24sQ2UsITEpO2NvbnN0IG9yPWNsYXNze2NvbnN0cnVjdG9yKGUpe0IodGhpcyxrZSk7Qih0aGlzLHBuKTtCKHRoaXMsJHQpO0IodGhpcyxrdCk7Qih0aGlzLFdlKTtCKHRoaXMsTGUpO0IodGhpcyxQZSk7Qih0aGlzLFkpO0IodGhpcyx6ZSk7Qih0aGlzLGRlKTtCKHRoaXMsQ3Qsdm9pZCAwKTtCKHRoaXMsT3Qsdm9pZCAwKTtCKHRoaXMsTnQsdm9pZCAwKTtCKHRoaXMsTXQsdm9pZCAwKTtCKHRoaXMsTWUsdm9pZCAwKTtMKHRoaXMsInR0bCIpO0wodGhpcywidHRsUmVzb2x1dGlvbiIpO0wodGhpcywidHRsQXV0b3B1cmdlIik7TCh0aGlzLCJ1cGRhdGVBZ2VPbkdldCIpO0wodGhpcywidXBkYXRlQWdlT25IYXMiKTtMKHRoaXMsImFsbG93U3RhbGUiKTtMKHRoaXMsIm5vRGlzcG9zZU9uU2V0Iik7TCh0aGlzLCJub1VwZGF0ZVRUTCIpO0wodGhpcywibWF4RW50cnlTaXplIik7TCh0aGlzLCJzaXplQ2FsY3VsYXRpb24iKTtMKHRoaXMsIm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiIpO0wodGhpcywibm9EZWxldGVPblN0YWxlR2V0Iik7TCh0aGlzLCJhbGxvd1N0YWxlT25GZXRjaEFib3J0Iik7TCh0aGlzLCJhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiIpO0wodGhpcywiaWdub3JlRmV0Y2hBYm9ydCIpO0IodGhpcyxodCx2b2lkIDApO0IodGhpcyxGdCx2b2lkIDApO0IodGhpcyxhdCx2b2lkIDApO0IodGhpcyxldCx2b2lkIDApO0IodGhpcyx2LHZvaWQgMCk7Qih0aGlzLF90LHZvaWQgMCk7Qih0aGlzLFR0LHZvaWQgMCk7Qih0aGlzLEV0LHZvaWQgMCk7Qih0aGlzLGZ0LHZvaWQgMCk7Qih0aGlzLEx0LHZvaWQgMCk7Qih0aGlzLGx0LHZvaWQgMCk7Qih0aGlzLFB0LHZvaWQgMCk7Qih0aGlzLHZ0LHZvaWQgMCk7Qih0aGlzLFJ0LHZvaWQgMCk7Qih0aGlzLER0LHZvaWQgMCk7Qih0aGlzLGVlLHZvaWQgMCk7Qih0aGlzLHB0LHZvaWQgMCk7Qih0aGlzLGZlLCgpPT57fSk7Qih0aGlzLHF0LCgpPT57fSk7Qih0aGlzLFZlLCgpPT57fSk7Qih0aGlzLGJ0LCgpPT4hMSk7Qih0aGlzLGxlLGU9Pnt9KTtCKHRoaXMsRmUsKGUsbixyKT0+e30pO0IodGhpcyxYZSwoZSxuLHIsaSk9PntpZihyfHxpKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbm5vdCBzZXQgc2l6ZSB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgb24gY2FjaGUiKTtyZXR1cm4gMH0pO0wodGhpcyxUbCwiTFJVQ2FjaGUiKTtjb25zdHttYXg6bj0wLHR0bDpyLHR0bFJlc29sdXRpb246aT0xLHR0bEF1dG9wdXJnZTpvLHVwZGF0ZUFnZU9uR2V0OnMsdXBkYXRlQWdlT25IYXM6aCxhbGxvd1N0YWxlOmEsZGlzcG9zZTpmLGRpc3Bvc2VBZnRlcjpkLG5vRGlzcG9zZU9uU2V0Ol8sbm9VcGRhdGVUVEw6UyxtYXhTaXplOk89MCxtYXhFbnRyeVNpemU6dz0wLHNpemVDYWxjdWxhdGlvbjpiLGZldGNoTWV0aG9kOk0sbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOm0sbm9EZWxldGVPblN0YWxlR2V0OkcsYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246USxhbGxvd1N0YWxlT25GZXRjaEFib3J0OkgsaWdub3JlRmV0Y2hBYm9ydDppdH09ZTtpZihuIT09MCYmIXRlKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiKTtjb25zdCB5dD1uP0JpKG4pOkFycmF5O2lmKCF5dCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbWF4IHZhbHVlOiAiK24pO2lmKFAodGhpcyxDdCxuKSxQKHRoaXMsT3QsTyksdGhpcy5tYXhFbnRyeVNpemU9d3x8Yyh0aGlzLE90KSx0aGlzLnNpemVDYWxjdWxhdGlvbj1iLHRoaXMuc2l6ZUNhbGN1bGF0aW9uKXtpZighYyh0aGlzLE90KSYmIXRoaXMubWF4RW50cnlTaXplKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSIpO2lmKHR5cGVvZiB0aGlzLnNpemVDYWxjdWxhdGlvbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gc2V0IHRvIG5vbi1mdW5jdGlvbiIpfWlmKE0hPT12b2lkIDAmJnR5cGVvZiBNIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImZldGNoTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQiKTtpZihQKHRoaXMsTWUsTSksUCh0aGlzLGVlLCEhTSksUCh0aGlzLGF0LG5ldyBNYXApLFAodGhpcyxldCxuZXcgQXJyYXkobikuZmlsbCh2b2lkIDApKSxQKHRoaXMsdixuZXcgQXJyYXkobikuZmlsbCh2b2lkIDApKSxQKHRoaXMsX3QsbmV3IHl0KG4pKSxQKHRoaXMsVHQsbmV3IHl0KG4pKSxQKHRoaXMsRXQsMCksUCh0aGlzLGZ0LDApLFAodGhpcyxMdCxfbi5jcmVhdGUobikpLFAodGhpcyxodCwwKSxQKHRoaXMsRnQsMCksdHlwZW9mIGY9PSJmdW5jdGlvbiImJlAodGhpcyxOdCxmKSx0eXBlb2YgZD09ImZ1bmN0aW9uIj8oUCh0aGlzLE10LGQpLFAodGhpcyxsdCxbXSkpOihQKHRoaXMsTXQsdm9pZCAwKSxQKHRoaXMsbHQsdm9pZCAwKSksUCh0aGlzLER0LCEhYyh0aGlzLE50KSksUCh0aGlzLHB0LCEhYyh0aGlzLE10KSksdGhpcy5ub0Rpc3Bvc2VPblNldD0hIV8sdGhpcy5ub1VwZGF0ZVRUTD0hIVMsdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb249ISFtLHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb249ISFRLHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydD0hIUgsdGhpcy5pZ25vcmVGZXRjaEFib3J0PSEhaXQsdGhpcy5tYXhFbnRyeVNpemUhPT0wKXtpZihjKHRoaXMsT3QpIT09MCYmIXRlKGModGhpcyxPdCkpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7aWYoIXRlKHRoaXMubWF4RW50cnlTaXplKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhFbnRyeVNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7Qyh0aGlzLHBuLFZpKS5jYWxsKHRoaXMpfWlmKHRoaXMuYWxsb3dTdGFsZT0hIWEsdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQ9ISFHLHRoaXMudXBkYXRlQWdlT25HZXQ9ISFzLHRoaXMudXBkYXRlQWdlT25IYXM9ISFoLHRoaXMudHRsUmVzb2x1dGlvbj10ZShpKXx8aT09PTA/aToxLHRoaXMudHRsQXV0b3B1cmdlPSEhbyx0aGlzLnR0bD1yfHwwLHRoaXMudHRsKXtpZighdGUodGhpcy50dGwpKXRocm93IG5ldyBUeXBlRXJyb3IoInR0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQiKTtDKHRoaXMsa2UsaHIpLmNhbGwodGhpcyl9aWYoYyh0aGlzLEN0KT09PTAmJnRoaXMudHRsPT09MCYmYyh0aGlzLE90KT09PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkIik7aWYoIXRoaXMudHRsQXV0b3B1cmdlJiYhYyh0aGlzLEN0KSYmIWModGhpcyxPdCkpe2NvbnN0IEF0PSJMUlVfQ0FDSEVfVU5CT1VOREVEIjtvbChBdCkmJihQaS5hZGQoQXQpLHZpKCJUVEwgY2FjaGluZyB3aXRob3V0IHR0bEF1dG9wdXJnZSwgbWF4LCBvciBtYXhTaXplIGNhbiByZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4iLCJVbmJvdW5kZWRDYWNoZVdhcm5pbmciLEF0LG9yKSl9fXN0YXRpYyB1bnNhZmVFeHBvc2VJbnRlcm5hbHMoZSl7cmV0dXJue3N0YXJ0czpjKGUsdnQpLHR0bHM6YyhlLFJ0KSxzaXplczpjKGUsUHQpLGtleU1hcDpjKGUsYXQpLGtleUxpc3Q6YyhlLGV0KSx2YWxMaXN0OmMoZSx2KSxuZXh0OmMoZSxfdCkscHJldjpjKGUsVHQpLGdldCBoZWFkKCl7cmV0dXJuIGMoZSxFdCl9LGdldCB0YWlsKCl7cmV0dXJuIGMoZSxmdCl9LGZyZWU6YyhlLEx0KSxpc0JhY2tncm91bmRGZXRjaDpuPT57dmFyIHI7cmV0dXJuIEMocj1lLFksbnQpLmNhbGwocixuKX0sYmFja2dyb3VuZEZldGNoOihuLHIsaSxvKT0+e3ZhciBzO3JldHVybiBDKHM9ZSxQZSxUbikuY2FsbChzLG4scixpLG8pfSxtb3ZlVG9UYWlsOm49Pnt2YXIgcjtyZXR1cm4gQyhyPWUsZGUscWUpLmNhbGwocixuKX0saW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIEMocj1lLCR0LG5lKS5jYWxsKHIsbil9LHJpbmRleGVzOm49Pnt2YXIgcjtyZXR1cm4gQyhyPWUsa3QscmUpLmNhbGwocixuKX0saXNTdGFsZTpuPT57dmFyIHI7cmV0dXJuIGMocj1lLGJ0KS5jYWxsKHIsbil9fX1nZXQgbWF4KCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IG1heFNpemUoKXtyZXR1cm4gYyh0aGlzLE90KX1nZXQgY2FsY3VsYXRlZFNpemUoKXtyZXR1cm4gYyh0aGlzLEZ0KX1nZXQgc2l6ZSgpe3JldHVybiBjKHRoaXMsaHQpfWdldCBmZXRjaE1ldGhvZCgpe3JldHVybiBjKHRoaXMsTWUpfWdldCBkaXNwb3NlKCl7cmV0dXJuIGModGhpcyxOdCl9Z2V0IGRpc3Bvc2VBZnRlcigpe3JldHVybiBjKHRoaXMsTXQpfWdldFJlbWFpbmluZ1RUTChlKXtyZXR1cm4gYyh0aGlzLGF0KS5oYXMoZSk/MS8wOjB9KmVudHJpZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsJHQsbmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiZjKHRoaXMsZXQpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGRbYyh0aGlzLGV0KVtlXSxjKHRoaXMsdilbZV1dKX0qcmVudHJpZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsa3QscmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiZjKHRoaXMsZXQpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGRbYyh0aGlzLGV0KVtlXSxjKHRoaXMsdilbZV1dKX0qa2V5cygpe2Zvcihjb25zdCBlIG9mIEModGhpcywkdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsZXQpW2VdO24hPT12b2lkIDAmJiFDKHRoaXMsWSxudCkuY2FsbCh0aGlzLGModGhpcyx2KVtlXSkmJih5aWVsZCBuKX19KnJrZXlzKCl7Zm9yKGNvbnN0IGUgb2YgQyh0aGlzLGt0LHJlKS5jYWxsKHRoaXMpKXtjb25zdCBuPWModGhpcyxldClbZV07biE9PXZvaWQgMCYmIUModGhpcyxZLG50KS5jYWxsKHRoaXMsYyh0aGlzLHYpW2VdKSYmKHlpZWxkIG4pfX0qdmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMpKWModGhpcyx2KVtlXSE9PXZvaWQgMCYmIUModGhpcyxZLG50KS5jYWxsKHRoaXMsYyh0aGlzLHYpW2VdKSYmKHlpZWxkIGModGhpcyx2KVtlXSl9KnJ2YWx1ZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsa3QscmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGQgYyh0aGlzLHYpW2VdKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX1maW5kKGUsbj17fSl7Zm9yKGNvbnN0IHIgb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyx2KVtyXSxvPUModGhpcyxZLG50KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG8hPT12b2lkIDAmJmUobyxjKHRoaXMsZXQpW3JdLHRoaXMpKXJldHVybiB0aGlzLmdldChjKHRoaXMsZXQpW3JdLG4pfX1mb3JFYWNoKGUsbj10aGlzKXtmb3IoY29uc3QgciBvZiBDKHRoaXMsJHQsbmUpLmNhbGwodGhpcykpe2NvbnN0IGk9Yyh0aGlzLHYpW3JdLG89Qyh0aGlzLFksbnQpLmNhbGwodGhpcyxpKT9pLl9fc3RhbGVXaGlsZUZldGNoaW5nOmk7byE9PXZvaWQgMCYmZS5jYWxsKG4sbyxjKHRoaXMsZXQpW3JdLHRoaXMpfX1yZm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2YgQyh0aGlzLGt0LHJlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyx2KVtyXSxvPUModGhpcyxZLG50KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLGV0KVtyXSx0aGlzKX19cHVyZ2VTdGFsZSgpe2xldCBlPSExO2Zvcihjb25zdCBuIG9mIEModGhpcyxrdCxyZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikmJih0aGlzLmRlbGV0ZShjKHRoaXMsZXQpW25dKSxlPSEwKTtyZXR1cm4gZX1pbmZvKGUpe2NvbnN0IG49Yyh0aGlzLGF0KS5nZXQoZSk7aWYobj09PXZvaWQgMClyZXR1cm47Y29uc3Qgcj1jKHRoaXMsdilbbl0saT1DKHRoaXMsWSxudCkuY2FsbCh0aGlzLHIpP3IuX19zdGFsZVdoaWxlRmV0Y2hpbmc6cjtpZihpPT09dm9pZCAwKXJldHVybjtjb25zdCBvPXt2YWx1ZTppfTtpZihjKHRoaXMsUnQpJiZjKHRoaXMsdnQpKXtjb25zdCBzPWModGhpcyxSdClbbl0saD1jKHRoaXMsdnQpW25dO2lmKHMmJmgpe2NvbnN0IGE9cy0oSWUubm93KCktaCk7by50dGw9YSxvLnN0YXJ0PURhdGUubm93KCl9fXJldHVybiBjKHRoaXMsUHQpJiYoby5zaXplPWModGhpcyxQdClbbl0pLG99ZHVtcCgpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMse2FsbG93U3RhbGU6ITB9KSl7Y29uc3Qgcj1jKHRoaXMsZXQpW25dLGk9Yyh0aGlzLHYpW25dLG89Qyh0aGlzLFksbnQpLmNhbGwodGhpcyxpKT9pLl9fc3RhbGVXaGlsZUZldGNoaW5nOmk7aWYobz09PXZvaWQgMHx8cj09PXZvaWQgMCljb250aW51ZTtjb25zdCBzPXt2YWx1ZTpvfTtpZihjKHRoaXMsUnQpJiZjKHRoaXMsdnQpKXtzLnR0bD1jKHRoaXMsUnQpW25dO2NvbnN0IGg9SWUubm93KCktYyh0aGlzLHZ0KVtuXTtzLnN0YXJ0PU1hdGguZmxvb3IoRGF0ZS5ub3coKS1oKX1jKHRoaXMsUHQpJiYocy5zaXplPWModGhpcyxQdClbbl0pLGUudW5zaGlmdChbcixzXSl9cmV0dXJuIGV9bG9hZChlKXt0aGlzLmNsZWFyKCk7Zm9yKGNvbnN0W24scl1vZiBlKXtpZihyLnN0YXJ0KXtjb25zdCBpPURhdGUubm93KCktci5zdGFydDtyLnN0YXJ0PUllLm5vdygpLWl9dGhpcy5zZXQobixyLnZhbHVlLHIpfX1zZXQoZSxuLHI9e30pe3ZhciBTLE8sdyxiLE07aWYobj09PXZvaWQgMClyZXR1cm4gdGhpcy5kZWxldGUoZSksdGhpcztjb25zdHt0dGw6aT10aGlzLnR0bCxzdGFydDpvLG5vRGlzcG9zZU9uU2V0OnM9dGhpcy5ub0Rpc3Bvc2VPblNldCxzaXplQ2FsY3VsYXRpb246aD10aGlzLnNpemVDYWxjdWxhdGlvbixzdGF0dXM6YX09cjtsZXR7bm9VcGRhdGVUVEw6Zj10aGlzLm5vVXBkYXRlVFRMfT1yO2NvbnN0IGQ9Yyh0aGlzLFhlKS5jYWxsKHRoaXMsZSxuLHIuc2l6ZXx8MCxoKTtpZih0aGlzLm1heEVudHJ5U2l6ZSYmZD50aGlzLm1heEVudHJ5U2l6ZSlyZXR1cm4gYSYmKGEuc2V0PSJtaXNzIixhLm1heEVudHJ5U2l6ZUV4Y2VlZGVkPSEwKSx0aGlzLmRlbGV0ZShlKSx0aGlzO2xldCBfPWModGhpcyxodCk9PT0wP3ZvaWQgMDpjKHRoaXMsYXQpLmdldChlKTtpZihfPT09dm9pZCAwKV89Yyh0aGlzLGh0KT09PTA/Yyh0aGlzLGZ0KTpjKHRoaXMsTHQpLmxlbmd0aCE9PTA/Yyh0aGlzLEx0KS5wb3AoKTpjKHRoaXMsaHQpPT09Yyh0aGlzLEN0KT9DKHRoaXMsTGUsT24pLmNhbGwodGhpcywhMSk6Yyh0aGlzLGh0KSxjKHRoaXMsZXQpW19dPWUsYyh0aGlzLHYpW19dPW4sYyh0aGlzLGF0KS5zZXQoZSxfKSxjKHRoaXMsX3QpW2ModGhpcyxmdCldPV8sYyh0aGlzLFR0KVtfXT1jKHRoaXMsZnQpLFAodGhpcyxmdCxfKSx4bih0aGlzLGh0KS5fKyssYyh0aGlzLEZlKS5jYWxsKHRoaXMsXyxkLGEpLGEmJihhLnNldD0iYWRkIiksZj0hMTtlbHNle0ModGhpcyxkZSxxZSkuY2FsbCh0aGlzLF8pO2NvbnN0IG09Yyh0aGlzLHYpW19dO2lmKG4hPT1tKXtpZihjKHRoaXMsZWUpJiZDKHRoaXMsWSxudCkuY2FsbCh0aGlzLG0pKXttLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigicmVwbGFjZWQiKSk7Y29uc3R7X19zdGFsZVdoaWxlRmV0Y2hpbmc6R309bTtHIT09dm9pZCAwJiYhcyYmKGModGhpcyxEdCkmJigoUz1jKHRoaXMsTnQpKT09bnVsbHx8Uy5jYWxsKHRoaXMsRyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChPPWModGhpcyxsdCkpPT1udWxsfHxPLnB1c2goW0csZSwic2V0Il0pKSl9ZWxzZSBzfHwoYyh0aGlzLER0KSYmKCh3PWModGhpcyxOdCkpPT1udWxsfHx3LmNhbGwodGhpcyxtLGUsInNldCIpKSxjKHRoaXMscHQpJiYoKGI9Yyh0aGlzLGx0KSk9PW51bGx8fGIucHVzaChbbSxlLCJzZXQiXSkpKTtpZihjKHRoaXMsbGUpLmNhbGwodGhpcyxfKSxjKHRoaXMsRmUpLmNhbGwodGhpcyxfLGQsYSksYyh0aGlzLHYpW19dPW4sYSl7YS5zZXQ9InJlcGxhY2UiO2NvbnN0IEc9bSYmQyh0aGlzLFksbnQpLmNhbGwodGhpcyxtKT9tLl9fc3RhbGVXaGlsZUZldGNoaW5nOm07RyE9PXZvaWQgMCYmKGEub2xkVmFsdWU9Ryl9fWVsc2UgYSYmKGEuc2V0PSJ1cGRhdGUiKX1pZihpIT09MCYmIWModGhpcyxSdCkmJkModGhpcyxrZSxocikuY2FsbCh0aGlzKSxjKHRoaXMsUnQpJiYoZnx8Yyh0aGlzLFZlKS5jYWxsKHRoaXMsXyxpLG8pLGEmJmModGhpcyxxdCkuY2FsbCh0aGlzLGEsXykpLCFzJiZjKHRoaXMscHQpJiZjKHRoaXMsbHQpKXtjb25zdCBtPWModGhpcyxsdCk7bGV0IEc7Zm9yKDtHPW09PW51bGw/dm9pZCAwOm0uc2hpZnQoKTspKE09Yyh0aGlzLE10KSk9PW51bGx8fE0uY2FsbCh0aGlzLC4uLkcpfXJldHVybiB0aGlzfXBvcCgpe3ZhciBlO3RyeXtmb3IoO2ModGhpcyxodCk7KXtjb25zdCBuPWModGhpcyx2KVtjKHRoaXMsRXQpXTtpZihDKHRoaXMsTGUsT24pLmNhbGwodGhpcywhMCksQyh0aGlzLFksbnQpLmNhbGwodGhpcyxuKSl7aWYobi5fX3N0YWxlV2hpbGVGZXRjaGluZylyZXR1cm4gbi5fX3N0YWxlV2hpbGVGZXRjaGluZ31lbHNlIGlmKG4hPT12b2lkIDApcmV0dXJuIG59fWZpbmFsbHl7aWYoYyh0aGlzLHB0KSYmYyh0aGlzLGx0KSl7Y29uc3Qgbj1jKHRoaXMsbHQpO2xldCByO2Zvcig7cj1uPT1udWxsP3ZvaWQgMDpuLnNoaWZ0KCk7KShlPWModGhpcyxNdCkpPT1udWxsfHxlLmNhbGwodGhpcywuLi5yKX19fWhhcyhlLG49e30pe2NvbnN0e3VwZGF0ZUFnZU9uSGFzOnI9dGhpcy51cGRhdGVBZ2VPbkhhcyxzdGF0dXM6aX09bixvPWModGhpcyxhdCkuZ2V0KGUpO2lmKG8hPT12b2lkIDApe2NvbnN0IHM9Yyh0aGlzLHYpW29dO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMscykmJnMuX19zdGFsZVdoaWxlRmV0Y2hpbmc9PT12b2lkIDApcmV0dXJuITE7aWYoYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbykpaSYmKGkuaGFzPSJzdGFsZSIsYyh0aGlzLHF0KS5jYWxsKHRoaXMsaSxvKSk7ZWxzZSByZXR1cm4gciYmYyh0aGlzLGZlKS5jYWxsKHRoaXMsbyksaSYmKGkuaGFzPSJoaXQiLGModGhpcyxxdCkuY2FsbCh0aGlzLGksbykpLCEwfWVsc2UgaSYmKGkuaGFzPSJtaXNzIik7cmV0dXJuITF9cGVlayhlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGV9PW4saT1jKHRoaXMsYXQpLmdldChlKTtpZihpPT09dm9pZCAwfHwhciYmYyh0aGlzLGJ0KS5jYWxsKHRoaXMsaSkpcmV0dXJuO2NvbnN0IG89Yyh0aGlzLHYpW2ldO3JldHVybiBDKHRoaXMsWSxudCkuY2FsbCh0aGlzLG8pP28uX19zdGFsZVdoaWxlRmV0Y2hpbmc6b31hc3luYyBmZXRjaChlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGUsdXBkYXRlQWdlT25HZXQ6aT10aGlzLnVwZGF0ZUFnZU9uR2V0LG5vRGVsZXRlT25TdGFsZUdldDpvPXRoaXMubm9EZWxldGVPblN0YWxlR2V0LHR0bDpzPXRoaXMudHRsLG5vRGlzcG9zZU9uU2V0Omg9dGhpcy5ub0Rpc3Bvc2VPblNldCxzaXplOmE9MCxzaXplQ2FsY3VsYXRpb246Zj10aGlzLnNpemVDYWxjdWxhdGlvbixub1VwZGF0ZVRUTDpkPXRoaXMubm9VcGRhdGVUVEwsbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOl89dGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246Uz10aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLGlnbm9yZUZldGNoQWJvcnQ6Tz10aGlzLmlnbm9yZUZldGNoQWJvcnQsYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDp3PXRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxjb250ZXh0OmIsZm9yY2VSZWZyZXNoOk09ITEsc3RhdHVzOm0sc2lnbmFsOkd9PW47aWYoIWModGhpcyxlZSkpcmV0dXJuIG0mJihtLmZldGNoPSJnZXQiKSx0aGlzLmdldChlLHthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byxzdGF0dXM6bX0pO2NvbnN0IFE9e2FsbG93U3RhbGU6cix1cGRhdGVBZ2VPbkdldDppLG5vRGVsZXRlT25TdGFsZUdldDpvLHR0bDpzLG5vRGlzcG9zZU9uU2V0Omgsc2l6ZTphLHNpemVDYWxjdWxhdGlvbjpmLG5vVXBkYXRlVFRMOmQsbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOl8sYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246UyxhbGxvd1N0YWxlT25GZXRjaEFib3J0OncsaWdub3JlRmV0Y2hBYm9ydDpPLHN0YXR1czptLHNpZ25hbDpHfTtsZXQgSD1jKHRoaXMsYXQpLmdldChlKTtpZihIPT09dm9pZCAwKXttJiYobS5mZXRjaD0ibWlzcyIpO2NvbnN0IGl0PUModGhpcyxQZSxUbikuY2FsbCh0aGlzLGUsSCxRLGIpO3JldHVybiBpdC5fX3JldHVybmVkPWl0fWVsc2V7Y29uc3QgaXQ9Yyh0aGlzLHYpW0hdO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMsaXQpKXtjb25zdCBVPXImJml0Ll9fc3RhbGVXaGlsZUZldGNoaW5nIT09dm9pZCAwO3JldHVybiBtJiYobS5mZXRjaD0iaW5mbGlnaHQiLFUmJihtLnJldHVybmVkU3RhbGU9ITApKSxVP2l0Ll9fc3RhbGVXaGlsZUZldGNoaW5nOml0Ll9fcmV0dXJuZWQ9aXR9Y29uc3QgeXQ9Yyh0aGlzLGJ0KS5jYWxsKHRoaXMsSCk7aWYoIU0mJiF5dClyZXR1cm4gbSYmKG0uZmV0Y2g9ImhpdCIpLEModGhpcyxkZSxxZSkuY2FsbCh0aGlzLEgpLGkmJmModGhpcyxmZSkuY2FsbCh0aGlzLEgpLG0mJmModGhpcyxxdCkuY2FsbCh0aGlzLG0sSCksaXQ7Y29uc3QgQXQ9Qyh0aGlzLFBlLFRuKS5jYWxsKHRoaXMsZSxILFEsYiksVD1BdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmcjtyZXR1cm4gbSYmKG0uZmV0Y2g9eXQ/InN0YWxlIjoicmVmcmVzaCIsVCYmeXQmJihtLnJldHVybmVkU3RhbGU9ITApKSxUP0F0Ll9fc3RhbGVXaGlsZUZldGNoaW5nOkF0Ll9fcmV0dXJuZWQ9QXR9fWdldChlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGUsdXBkYXRlQWdlT25HZXQ6aT10aGlzLnVwZGF0ZUFnZU9uR2V0LG5vRGVsZXRlT25TdGFsZUdldDpvPXRoaXMubm9EZWxldGVPblN0YWxlR2V0LHN0YXR1czpzfT1uLGg9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaCE9PXZvaWQgMCl7Y29uc3QgYT1jKHRoaXMsdilbaF0sZj1DKHRoaXMsWSxudCkuY2FsbCh0aGlzLGEpO3JldHVybiBzJiZjKHRoaXMscXQpLmNhbGwodGhpcyxzLGgpLGModGhpcyxidCkuY2FsbCh0aGlzLGgpPyhzJiYocy5nZXQ9InN0YWxlIiksZj8ocyYmciYmYS5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHMucmV0dXJuZWRTdGFsZT0hMCkscj9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOnZvaWQgMCk6KG98fHRoaXMuZGVsZXRlKGUpLHMmJnImJihzLnJldHVybmVkU3RhbGU9ITApLHI/YTp2b2lkIDApKToocyYmKHMuZ2V0PSJoaXQiKSxmP2EuX19zdGFsZVdoaWxlRmV0Y2hpbmc6KEModGhpcyxkZSxxZSkuY2FsbCh0aGlzLGgpLGkmJmModGhpcyxmZSkuY2FsbCh0aGlzLGgpLGEpKX1lbHNlIHMmJihzLmdldD0ibWlzcyIpfWRlbGV0ZShlKXt2YXIgcixpLG8scztsZXQgbj0hMTtpZihjKHRoaXMsaHQpIT09MCl7Y29uc3QgaD1jKHRoaXMsYXQpLmdldChlKTtpZihoIT09dm9pZCAwKWlmKG49ITAsYyh0aGlzLGh0KT09PTEpdGhpcy5jbGVhcigpO2Vsc2V7Yyh0aGlzLGxlKS5jYWxsKHRoaXMsaCk7Y29uc3QgYT1jKHRoaXMsdilbaF07aWYoQyh0aGlzLFksbnQpLmNhbGwodGhpcyxhKT9hLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZGVsZXRlZCIpKTooYyh0aGlzLER0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsRHQpJiYoKHI9Yyh0aGlzLE50KSk9PW51bGx8fHIuY2FsbCh0aGlzLGEsZSwiZGVsZXRlIikpLGModGhpcyxwdCkmJigoaT1jKHRoaXMsbHQpKT09bnVsbHx8aS5wdXNoKFthLGUsImRlbGV0ZSJdKSkpLGModGhpcyxhdCkuZGVsZXRlKGUpLGModGhpcyxldClbaF09dm9pZCAwLGModGhpcyx2KVtoXT12b2lkIDAsaD09PWModGhpcyxmdCkpUCh0aGlzLGZ0LGModGhpcyxUdClbaF0pO2Vsc2UgaWYoaD09PWModGhpcyxFdCkpUCh0aGlzLEV0LGModGhpcyxfdClbaF0pO2Vsc2V7Y29uc3QgZj1jKHRoaXMsVHQpW2hdO2ModGhpcyxfdClbZl09Yyh0aGlzLF90KVtoXTtjb25zdCBkPWModGhpcyxfdClbaF07Yyh0aGlzLFR0KVtkXT1jKHRoaXMsVHQpW2hdfXhuKHRoaXMsaHQpLl8tLSxjKHRoaXMsTHQpLnB1c2goaCl9fWlmKGModGhpcyxwdCkmJigobz1jKHRoaXMsbHQpKSE9bnVsbCYmby5sZW5ndGgpKXtjb25zdCBoPWModGhpcyxsdCk7bGV0IGE7Zm9yKDthPWg9PW51bGw/dm9pZCAwOmguc2hpZnQoKTspKHM9Yyh0aGlzLE10KSk9PW51bGx8fHMuY2FsbCh0aGlzLC4uLmEpfXJldHVybiBufWNsZWFyKCl7dmFyIGUsbixyO2Zvcihjb25zdCBpIG9mIEModGhpcyxrdCxyZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IG89Yyh0aGlzLHYpW2ldO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMsbykpby5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk7ZWxzZXtjb25zdCBzPWModGhpcyxldClbaV07Yyh0aGlzLER0KSYmKChlPWModGhpcyxOdCkpPT1udWxsfHxlLmNhbGwodGhpcyxvLHMsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKG49Yyh0aGlzLGx0KSk9PW51bGx8fG4ucHVzaChbbyxzLCJkZWxldGUiXSkpfX1pZihjKHRoaXMsYXQpLmNsZWFyKCksYyh0aGlzLHYpLmZpbGwodm9pZCAwKSxjKHRoaXMsZXQpLmZpbGwodm9pZCAwKSxjKHRoaXMsUnQpJiZjKHRoaXMsdnQpJiYoYyh0aGlzLFJ0KS5maWxsKDApLGModGhpcyx2dCkuZmlsbCgwKSksYyh0aGlzLFB0KSYmYyh0aGlzLFB0KS5maWxsKDApLFAodGhpcyxFdCwwKSxQKHRoaXMsZnQsMCksYyh0aGlzLEx0KS5sZW5ndGg9MCxQKHRoaXMsRnQsMCksUCh0aGlzLGh0LDApLGModGhpcyxwdCkmJmModGhpcyxsdCkpe2NvbnN0IGk9Yyh0aGlzLGx0KTtsZXQgbztmb3IoO289aT09bnVsbD92b2lkIDA6aS5zaGlmdCgpOykocj1jKHRoaXMsTXQpKT09bnVsbHx8ci5jYWxsKHRoaXMsLi4ubyl9fX07bGV0IGlyPW9yO1RsPVN5bWJvbC50b1N0cmluZ1RhZyxDdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxOdD1uZXcgV2Vha01hcCxNdD1uZXcgV2Vha01hcCxNZT1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCxGdD1uZXcgV2Vha01hcCxhdD1uZXcgV2Vha01hcCxldD1uZXcgV2Vha01hcCx2PW5ldyBXZWFrTWFwLF90PW5ldyBXZWFrTWFwLFR0PW5ldyBXZWFrTWFwLEV0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLEx0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLFB0PW5ldyBXZWFrTWFwLHZ0PW5ldyBXZWFrTWFwLFJ0PW5ldyBXZWFrTWFwLER0PW5ldyBXZWFrTWFwLGVlPW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGtlPW5ldyBXZWFrU2V0LGhyPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgRW4oYyh0aGlzLEN0KSksbj1uZXcgRW4oYyh0aGlzLEN0KSk7UCh0aGlzLFJ0LGUpLFAodGhpcyx2dCxuKSxQKHRoaXMsVmUsKG8scyxoPUllLm5vdygpKT0+e2lmKG5bb109cyE9PTA/aDowLGVbb109cyxzIT09MCYmdGhpcy50dGxBdXRvcHVyZ2Upe2NvbnN0IGE9c2V0VGltZW91dCgoKT0+e2ModGhpcyxidCkuY2FsbCh0aGlzLG8pJiZ0aGlzLmRlbGV0ZShjKHRoaXMsZXQpW29dKX0scysxKTthLnVucmVmJiZhLnVucmVmKCl9fSksUCh0aGlzLGZlLG89PntuW29dPWVbb10hPT0wP0llLm5vdygpOjB9KSxQKHRoaXMscXQsKG8scyk9PntpZihlW3NdKXtjb25zdCBoPWVbc10sYT1uW3NdO2lmKCFofHwhYSlyZXR1cm47by50dGw9aCxvLnN0YXJ0PWEsby5ub3c9cnx8aSgpO2NvbnN0IGY9by5ub3ctYTtvLnJlbWFpbmluZ1RUTD1oLWZ9fSk7bGV0IHI9MDtjb25zdCBpPSgpPT57Y29uc3Qgbz1JZS5ub3coKTtpZih0aGlzLnR0bFJlc29sdXRpb24+MCl7cj1vO2NvbnN0IHM9c2V0VGltZW91dCgoKT0+cj0wLHRoaXMudHRsUmVzb2x1dGlvbik7cy51bnJlZiYmcy51bnJlZigpfXJldHVybiBvfTt0aGlzLmdldFJlbWFpbmluZ1RUTD1vPT57Y29uc3Qgcz1jKHRoaXMsYXQpLmdldChvKTtpZihzPT09dm9pZCAwKXJldHVybiAwO2NvbnN0IGg9ZVtzXSxhPW5bc107aWYoIWh8fCFhKXJldHVybiAxLzA7Y29uc3QgZj0ocnx8aSgpKS1hO3JldHVybiBoLWZ9LFAodGhpcyxidCxvPT57Y29uc3Qgcz1uW29dLGg9ZVtvXTtyZXR1cm4hIWgmJiEhcyYmKHJ8fGkoKSktcz5ofSl9LGZlPW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLFZlPW5ldyBXZWFrTWFwLGJ0PW5ldyBXZWFrTWFwLHBuPW5ldyBXZWFrU2V0LFZpPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgRW4oYyh0aGlzLEN0KSk7UCh0aGlzLEZ0LDApLFAodGhpcyxQdCxlKSxQKHRoaXMsbGUsbj0+e1AodGhpcyxGdCxjKHRoaXMsRnQpLWVbbl0pLGVbbl09MH0pLFAodGhpcyxYZSwobixyLGksbyk9PntpZihDKHRoaXMsWSxudCkuY2FsbCh0aGlzLHIpKXJldHVybiAwO2lmKCF0ZShpKSlpZihvKXtpZih0eXBlb2YgbyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoaT1vKHIsbiksIXRlKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoInNpemVDYWxjdWxhdGlvbiByZXR1cm4gaW52YWxpZCAoZXhwZWN0IHBvc2l0aXZlIGludGVnZXIpIil9ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuIFdoZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uIG9yIHNpemUgbXVzdCBiZSBzZXQuIik7cmV0dXJuIGl9KSxQKHRoaXMsRmUsKG4scixpKT0+e2lmKGVbbl09cixjKHRoaXMsT3QpKXtjb25zdCBvPWModGhpcyxPdCktZVtuXTtmb3IoO2ModGhpcyxGdCk+bzspQyh0aGlzLExlLE9uKS5jYWxsKHRoaXMsITApfVAodGhpcyxGdCxjKHRoaXMsRnQpK2Vbbl0pLGkmJihpLmVudHJ5U2l6ZT1yLGkudG90YWxDYWxjdWxhdGVkU2l6ZT1jKHRoaXMsRnQpKX0pfSxsZT1uZXcgV2Vha01hcCxGZT1uZXcgV2Vha01hcCxYZT1uZXcgV2Vha01hcCwkdD1uZXcgV2Vha1NldCxuZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsaHQpKWZvcihsZXQgbj1jKHRoaXMsZnQpOyEoIUModGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLEV0KSkpOyluPWModGhpcyxUdClbbl19LGt0PW5ldyBXZWFrU2V0LHJlPWZ1bmN0aW9uKih7YWxsb3dTdGFsZTplPXRoaXMuYWxsb3dTdGFsZX09e30pe2lmKGModGhpcyxodCkpZm9yKGxldCBuPWModGhpcyxFdCk7ISghQyh0aGlzLFdlLGNyKS5jYWxsKHRoaXMsbil8fCgoZXx8IWModGhpcyxidCkuY2FsbCh0aGlzLG4pKSYmKHlpZWxkIG4pLG49PT1jKHRoaXMsZnQpKSk7KW49Yyh0aGlzLF90KVtuXX0sV2U9bmV3IFdlYWtTZXQsY3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJmModGhpcyxhdCkuZ2V0KGModGhpcyxldClbZV0pPT09ZX0sTGU9bmV3IFdlYWtTZXQsT249ZnVuY3Rpb24oZSl7dmFyIG8scztjb25zdCBuPWModGhpcyxFdCkscj1jKHRoaXMsZXQpW25dLGk9Yyh0aGlzLHYpW25dO3JldHVybiBjKHRoaXMsZWUpJiZDKHRoaXMsWSxudCkuY2FsbCh0aGlzLGkpP2kuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJldmljdGVkIikpOihjKHRoaXMsRHQpfHxjKHRoaXMscHQpKSYmKGModGhpcyxEdCkmJigobz1jKHRoaXMsTnQpKT09bnVsbHx8by5jYWxsKHRoaXMsaSxyLCJldmljdCIpKSxjKHRoaXMscHQpJiYoKHM9Yyh0aGlzLGx0KSk9PW51bGx8fHMucHVzaChbaSxyLCJldmljdCJdKSkpLGModGhpcyxsZSkuY2FsbCh0aGlzLG4pLGUmJihjKHRoaXMsZXQpW25dPXZvaWQgMCxjKHRoaXMsdilbbl09dm9pZCAwLGModGhpcyxMdCkucHVzaChuKSksYyh0aGlzLGh0KT09PTE/KFAodGhpcyxFdCxQKHRoaXMsZnQsMCkpLGModGhpcyxMdCkubGVuZ3RoPTApOlAodGhpcyxFdCxjKHRoaXMsX3QpW25dKSxjKHRoaXMsYXQpLmRlbGV0ZShyKSx4bih0aGlzLGh0KS5fLS0sbn0sUGU9bmV3IFdlYWtTZXQsVG49ZnVuY3Rpb24oZSxuLHIsaSl7Y29uc3Qgbz1uPT09dm9pZCAwP3ZvaWQgMDpjKHRoaXMsdilbbl07aWYoQyh0aGlzLFksbnQpLmNhbGwodGhpcyxvKSlyZXR1cm4gbztjb25zdCBzPW5ldyBkbix7c2lnbmFsOmh9PXI7aD09bnVsbHx8aC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnMuYWJvcnQoaC5yZWFzb24pLHtzaWduYWw6cy5zaWduYWx9KTtjb25zdCBhPXtzaWduYWw6cy5zaWduYWwsb3B0aW9uczpyLGNvbnRleHQ6aX0sZj0oYixNPSExKT0+e2NvbnN0e2Fib3J0ZWQ6bX09cy5zaWduYWwsRz1yLmlnbm9yZUZldGNoQWJvcnQmJmIhPT12b2lkIDA7aWYoci5zdGF0dXMmJihtJiYhTT8oci5zdGF0dXMuZmV0Y2hBYm9ydGVkPSEwLHIuc3RhdHVzLmZldGNoRXJyb3I9cy5zaWduYWwucmVhc29uLEcmJihyLnN0YXR1cy5mZXRjaEFib3J0SWdub3JlZD0hMCkpOnIuc3RhdHVzLmZldGNoUmVzb2x2ZWQ9ITApLG0mJiFHJiYhTSlyZXR1cm4gXyhzLnNpZ25hbC5yZWFzb24pO2NvbnN0IFE9TztyZXR1cm4gYyh0aGlzLHYpW25dPT09TyYmKGI9PT12b2lkIDA/US5fX3N0YWxlV2hpbGVGZXRjaGluZz9jKHRoaXMsdilbbl09US5fX3N0YWxlV2hpbGVGZXRjaGluZzp0aGlzLmRlbGV0ZShlKTooci5zdGF0dXMmJihyLnN0YXR1cy5mZXRjaFVwZGF0ZWQ9ITApLHRoaXMuc2V0KGUsYixhLm9wdGlvbnMpKSksYn0sZD1iPT4oci5zdGF0dXMmJihyLnN0YXR1cy5mZXRjaFJlamVjdGVkPSEwLHIuc3RhdHVzLmZldGNoRXJyb3I9YiksXyhiKSksXz1iPT57Y29uc3R7YWJvcnRlZDpNfT1zLnNpZ25hbCxtPU0mJnIuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxHPW18fHIuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sUT1HfHxyLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixIPU87aWYoYyh0aGlzLHYpW25dPT09TyYmKCFRfHxILl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwP3RoaXMuZGVsZXRlKGUpOm18fChjKHRoaXMsdilbbl09SC5fX3N0YWxlV2hpbGVGZXRjaGluZykpLEcpcmV0dXJuIHIuc3RhdHVzJiZILl9fc3RhbGVXaGlsZUZldGNoaW5nIT09dm9pZCAwJiYoci5zdGF0dXMucmV0dXJuZWRTdGFsZT0hMCksSC5fX3N0YWxlV2hpbGVGZXRjaGluZztpZihILl9fcmV0dXJuZWQ9PT1IKXRocm93IGJ9LFM9KGIsTSk9Pnt2YXIgRztjb25zdCBtPShHPWModGhpcyxNZSkpPT1udWxsP3ZvaWQgMDpHLmNhbGwodGhpcyxlLG8sYSk7bSYmbSBpbnN0YW5jZW9mIFByb21pc2UmJm0udGhlbihRPT5iKFE9PT12b2lkIDA/dm9pZCAwOlEpLE0pLHMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoKT0+eyghci5pZ25vcmVGZXRjaEFib3J0fHxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpJiYoYih2b2lkIDApLHIuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCYmKGI9UT0+ZihRLCEwKSkpfSl9O3Iuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkPSEwKTtjb25zdCBPPW5ldyBQcm9taXNlKFMpLnRoZW4oZixkKSx3PU9iamVjdC5hc3NpZ24oTyx7X19hYm9ydENvbnRyb2xsZXI6cyxfX3N0YWxlV2hpbGVGZXRjaGluZzpvLF9fcmV0dXJuZWQ6dm9pZCAwfSk7cmV0dXJuIG49PT12b2lkIDA/KHRoaXMuc2V0KGUsdyx7Li4uYS5vcHRpb25zLHN0YXR1czp2b2lkIDB9KSxuPWModGhpcyxhdCkuZ2V0KGUpKTpjKHRoaXMsdilbbl09dyx3fSxZPW5ldyBXZWFrU2V0LG50PWZ1bmN0aW9uKGUpe2lmKCFjKHRoaXMsZWUpKXJldHVybiExO2NvbnN0IG49ZTtyZXR1cm4hIW4mJm4gaW5zdGFuY2VvZiBQcm9taXNlJiZuLmhhc093blByb3BlcnR5KCJfX3N0YWxlV2hpbGVGZXRjaGluZyIpJiZuLl9fYWJvcnRDb250cm9sbGVyIGluc3RhbmNlb2YgZG59LHplPW5ldyBXZWFrU2V0LHVyPWZ1bmN0aW9uKGUsbil7Yyh0aGlzLFR0KVtuXT1lLGModGhpcyxfdClbZV09bn0sZGU9bmV3IFdlYWtTZXQscWU9ZnVuY3Rpb24oZSl7ZSE9PWModGhpcyxmdCkmJihlPT09Yyh0aGlzLEV0KT9QKHRoaXMsRXQsYyh0aGlzLF90KVtlXSk6Qyh0aGlzLHplLHVyKS5jYWxsKHRoaXMsYyh0aGlzLFR0KVtlXSxjKHRoaXMsX3QpW2VdKSxDKHRoaXMsemUsdXIpLmNhbGwodGhpcyxjKHRoaXMsZnQpLGUpLFAodGhpcyxmdCxlKSl9O2NvbnN0IFVpPW5ldyBpcih7bWF4OjFlM30pLHNsPSh0LGUsbik9Pntjb25zdCByPUpTT04uc3RyaW5naWZ5KHQucHJvcGVydGllcyksaT1VaS5nZXQocik7aWYoaSlyZXR1cm4gaTtjb25zdCBvPSgoKT0+e3N3aXRjaChYdC50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKSxzPSgoKT0+e2lmKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpIT09InNpbXBsZSJ8fCFvKXJldHVybjtjb25zdCBhPWFsKCIiLHQsZSxvKTtpZihhKXJldHVybiBsbj09bnVsbD92b2lkIDA6bG4obixhKX0pKCksaD0oKCk9PntpZihvPT09InBvbHlnb24iKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMucG9seWdvbjtyZXR1cm57ZmlsbFN0eWxlOigoYT09bnVsbD92b2lkIDA6YS5maWxsKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLmZpbGxDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5zdHJva2UmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnN0cm9rZVdpZHRoLGxpbmVKb2luOmE9PW51bGw/dm9pZCAwOmEubGluZUpvaW59fWlmKG89PT0icG9seWxpbmUiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMucG9seWxpbmU7cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlQ29sb3ImJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnN0cm9rZVdpZHRofX1pZihvPT09Im1hcmtlciIpe2NvbnN0IGE9cz09bnVsbD92b2lkIDA6cy5tYXJrZXI7cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcik/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5wb2ludENvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnBvaW50Q29sb3ImJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsbGluZVdpZHRoOmE9PW51bGw/dm9pZCAwOmEucG9pbnRTaXplfX19KSgpO3JldHVybiBVaS5zZXQocixoKSxofSxhbD0odCxlLG4scik9Pntjb25zdCBpPWUubG9hZEdlb21ldHJ5KCksW28sc109KCgpPT57aWYocj09PSJwb2x5Z29uIilyZXR1cm5bIlBvbHlnb24iLGkubWFwKGg9PmgubWFwKGE9PlthLngsYS55XSkpXTtpZihyPT09InBvbHlsaW5lIilyZXR1cm5bIkxpbmVTdHJpbmciLGlbMF0ubWFwKGg9PltoLngsaC55XSldO2lmKHI9PT0ibWFya2VyIilyZXR1cm5bIlBvaW50IixbaVswXVswXS54LGlbMF1bMF0ueV1dO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcHBlYXJhbmNlICR7cn1gKX0pKCk7cmV0dXJue3R5cGU6ImZlYXR1cmUiLGlkOnQsZ2VvbWV0cnk6e3R5cGU6byxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOmUucHJvcGVydGllcyxyYW5nZTp7eDpuLngseTpuLnksejpuLmxldmVsfX19O2Z1bmN0aW9uIGhsKHQpe3JldHVybiB1bCh0KT09PW1uLkNPVU5URVJfQ0xPQ0tXSVNFfWZ1bmN0aW9uIGppKHQsZSl7Y29uc3Qgbj10Lngscj10Lnk7bGV0IGk9ITE7Zm9yKGxldCBvPTAscz1lLmxlbmd0aC0xO288ZS5sZW5ndGg7cz1vKyspe2NvbnN0IGg9ZVtvXS54LGE9ZVtvXS55LGY9ZVtzXS54LGQ9ZVtzXS55O2E+ciE9ZD5yJiZuPChmLWgpKihyLWEpLyhkLWEpK2gmJihpPSFpKX1yZXR1cm4gaX1mdW5jdGlvbiBjbCh0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKGppKGUsdFtuXSkpe2xldCByPSExO2Zvcig7bisxPHQubGVuZ3RoJiYhaGwodFtuKzFdKTspbisrLCFyJiZqaShlLHRbbl0pJiYocj0hMCk7aWYoIXIpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gdWwodCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgbj10W2UtMV0ueCoodFswXS55LXRbZS0yXS55KSt0WzBdLngqKHRbMV0ueS10W2UtMV0ueSk7Zm9yKGxldCByPTE7cjw9ZS0yO3IrKyluKz10W3JdLngqKHRbcisxXS55LXRbci0xXS55KTtpZihpc05hTihuKSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIG4+MD9tbi5DT1VOVEVSX0NMT0NLV0lTRTptbi5DTE9DS1dJU0V9Y29uc3QgJGU9MjU2O2NsYXNzIGZse2NvbnN0cnVjdG9yKGUpe0wodGhpcywiX3VybFRlbXBsYXRlIik7TCh0aGlzLCJfcGFyc2VUaWxlIik7TCh0aGlzLCJfdGlsaW5nU2NoZW1lIik7TCh0aGlzLCJfbGF5ZXJOYW1lcyIpO0wodGhpcywiX3RpbGVXaWR0aCIpO0wodGhpcywiX3RpbGVIZWlnaHQiKTtMKHRoaXMsIl9waWNrUG9pbnRSYWRpdXMiKTtMKHRoaXMsIl9waWNrTGluZVdpZHRoIik7TCh0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1sbCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD0kZSx0aGlzLl90aWxlSGVpZ2h0PSRlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcgS3QsdGhpcy5fcGlja1BvaW50UmFkaXVzPWUucGlja1BvaW50UmFkaXVzPz9kbCx0aGlzLl9waWNrTGluZVdpZHRoPWUucGlja0xpbmVXaWR0aD8/RWx9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89R2kodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCBoPWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksZj1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9Pmg9PW51bGw/dm9pZCAwOmgubGF5ZXJzW2RdKTtmJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby8kZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvLyRlLDAsMCksZi5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz0kZS9kLmV4dGVudDtmb3IobGV0IFM9MDtTPGQubGVuZ3RoO1MrKyl7Y29uc3QgTz1kLmZlYXR1cmUoUyksdz1zbChPLHIscyk7aWYoIXcpY29udGludWU7bi5maWxsU3R5bGU9dy5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9dy5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD13LmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj13LmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IGI9Ty5sb2FkR2VvbWV0cnkoKTtYdC50eXBlc1tPLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixiLF8sKHcubGluZVdpZHRoPz8xKT4wKTpYdC50eXBlc1tPLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLGIsXyk6WHQudHlwZXNbTy50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sYixfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Ty50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspe2NvbnN0IHM9bltvXTtsZXQgaD1zWzBdO2UubW92ZVRvKGgueCpyLGgueSpyKTtmb3IobGV0IGE9MTthPHMubGVuZ3RoO2ErKyloPXNbYV0sZS5saW5lVG8oaC54KnIsaC55KnIpO2UuY2xvc2VQYXRoKCl9aSYmZS5zdHJva2UoKSxlLmZpbGwoKX1fcmVuZGVyUG9pbnQoZSxuLHIpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2NvbnN0IG89bltpXVswXSxbcyxoXT1bby54KnIsby55KnJdLGE9ZS5saW5lV2lkdGg7ZS5iZWdpblBhdGgoKSxlLmFyYyhzLGgsYSwwLDIqTWF0aC5QSSksZS5maWxsKCl9fV9yZW5kZXJMaW5lU3RyaW5nKGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgbz1uW2ldWzBdO2UubW92ZVRvKG8ueCpyLG8ueSpyKTtmb3IobGV0IHM9MTtzPG5baV0ubGVuZ3RoO3MrKylvPW5baV1bc10sZS5saW5lVG8oby54KnIsby55KnIpfWUuc3Ryb2tlKCl9cGlja0ZlYXR1cmVzKGUsbixyLGkpe2NvbnN0IG89R2kodGhpcy5fdXJsVGVtcGxhdGUsZSk7cmV0dXJuIHRoaXMuX3BpY2tGZWF0dXJlc0Zyb21MYXllcihvLGUsbixyLGkpfWFzeW5jIF9waWNrRmVhdHVyZXNGcm9tTGF5ZXIoZSxuLHIsaSxvKXt0cnl7Y29uc3Qgcz1hd2FpdCB0aGlzLl9jYWNoZWRUaWxlKGUpO3JldHVybiBzPyhhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9sYXllck5hbWVzLm1hcChhc3luYyBhPT57Y29uc3QgZj1zLmxheWVyc1thXTtpZighZilyZXR1cm5bXTtjb25zdCBkPWF3YWl0IHRoaXMuX3BpY2tGZWF0dXJlcyhuLHIsaSxmLG8pO3JldHVybiBkfHxbXX0pKSkuZmxhdCgpOltdfWNhdGNoe3JldHVybltdfX1hc3luYyBfcGlja0ZlYXR1cmVzKGUsbixyLGksbyl7Y29uc3Qgcz10aGlzLl90aWxpbmdTY2hlbWUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGUoZS54LGUueSxlLmxldmVsKSxoPVtzLndlc3Qscy5lYXN0XSxhPVtzLm5vcnRoLHMuc291dGhdLGY9ZnVuY3Rpb24oYixNLG0sRyxRKXtjb25zdCBIPW5ldyB4O3guc3VidHJhY3QoYixuZXcgeChNWzBdLG1bMF0pLEgpO2NvbnN0IGl0PW5ldyB4KChHWzFdLUdbMF0pLyhNWzFdLU1bMF0pLChRWzFdLVFbMF0pLyhtWzFdLW1bMF0pKTtyZXR1cm4geC5hZGQoeC5tdWx0aXBseUNvbXBvbmVudHMoSCxpdCxuZXcgeCksbmV3IHgoR1swXSxRWzBdKSxuZXcgeCl9LGQ9W10sXz1bMCxpLmV4dGVudC0xXSxTPShfWzFdLV9bMF0pL3RoaXMuX3RpbGVXaWR0aCxPPWYoeC5mcm9tQ2FydGVzaWFuMyh0aGlzLl90aWxpbmdTY2hlbWUucHJvamVjdGlvbi5wcm9qZWN0KG5ldyB6KG4scikpKSxoLGEsXyxfKSx3PW5ldyBlbihPLngsTy55KTtmb3IobGV0IGI9MDtiPGkubGVuZ3RoO2IrKyl7Y29uc3QgTT1pLmZlYXR1cmUoYik7aWYoWHQudHlwZXNbTS50eXBlXT09PSJQb2x5Z29uIiYmY2woTS5sb2FkR2VvbWV0cnkoKSx3KXx8WHQudHlwZXNbTS50eXBlXT09PSJMaW5lU3RyaW5nIiYmJHUoTS5sb2FkR2VvbWV0cnkoKSx3LCRpKHRoaXMuX3BpY2tMaW5lV2lkdGgsTSxlKSpTKXx8WHQudHlwZXNbTS50eXBlXT09PSJQb2ludCImJkd1KE0ubG9hZEdlb21ldHJ5KCksdywkaSh0aGlzLl9waWNrUG9pbnRSYWRpdXMsTSxlKSpTKSl7Y29uc3QgbT1ubChNLGUsbyk7bSYmZC5wdXNoKG0pfX1yZXR1cm4gZH1hc3luYyBfY2FjaGVkVGlsZShlKXt2YXIgbixyO2lmKGUpe2lmKChuPXRoaXMuX3RpbGVDYWNoZXMpIT1udWxsJiZuLmhhcyhlKSlyZXR1cm4gdGhpcy5fdGlsZUNhY2hlcy5nZXQoZSk7dHJ5e2NvbnN0IGk9eWwoYXdhaXQgdGhpcy5fcGFyc2VUaWxlKGUpKTtyZXR1cm4gaSYmKChyPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxyLnNldChlLGkpKSxpfWNhdGNoe3JldHVybn19fWNsZWFyQ2FjaGUoKXt2YXIgZTsoZT10aGlzLl90aWxlQ2FjaGVzKT09bnVsbHx8ZS5jbGVhcigpfX1jb25zdCBsbD1hc3luYyB0PT57dHJ5e2NvbnN0IGU9YXdhaXQgcGwodCk7cmV0dXJuIGU/X2woZSk6dm9pZCAwfWNhdGNoe3JldHVybn19LGRsPTUsRWw9NSxfbD10PT5uZXcgRG8obmV3IEJvKHQpKSxwbD1hc3luYyB0PT57aWYoIXQpe2NvbnNvbGUuZXJyb3IoImZldGNoIHJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgcmVxdWVzdCB1cmwgaXMgdW5kZWZpbmVkIik7cmV0dXJufXRyeXtjb25zdCBlPWF3YWl0IGZldGNoKHQpO3JldHVybiBlLm9rP2F3YWl0IGUuYXJyYXlCdWZmZXIoKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0seWw9dD0+e3ZhciBuO2lmKCF0KXJldHVybjtjb25zdCBlPXt9O2Zvcihjb25zdFtyLGldb2YgT2JqZWN0LmVudHJpZXModC5sYXllcnMpKXtjb25zdCBvPVtdLHM9aTtmb3IobGV0IGg9MDtoPHMubGVuZ3RoO2grKyl7Y29uc3QgYT1zLmZlYXR1cmUoaCk7bGV0IGY7Y29uc3QgZD0obj1hLmJib3gpPT1udWxsP3ZvaWQgMDpuLmNhbGwoYSksXz17Li4uYSxpZDphLmlkLGxvYWRHZW9tZXRyeTooKT0+KGZ8fChmPWEubG9hZEdlb21ldHJ5KCkpLGYpLGJib3g6ZD8oKT0+ZDp2b2lkIDAsdG9HZW9KU09OOmEudG9HZW9KU09OfTtvLnB1c2goXyl9ZVtyXT17Li4ucyxmZWF0dXJlOmg9Pm9baF19fXJldHVybntsYXllcnM6ZX19LEdpPSh0LGUpPT5kZWNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZSgie3p9IixTdHJpbmcoZS5sZXZlbCkpLnJlcGxhY2UoInt4fSIsU3RyaW5nKGUueCkpLnJlcGxhY2UoInt5fSIsU3RyaW5nKGUueSkpO2Z1bmN0aW9uICRpKHQsZSxuKXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q6dChlLG4pfWNvbnN0IEFsPW5ldyBNYXA7ZnVuY3Rpb24geGwoe3VybFRlbXBsYXRlOnQsbWF4aW11bUxldmVsOmV9KXtyZXR1cm5gJHt0fToke2V9YH1hc3luYyBmdW5jdGlvbiBPbCh0KXtjb25zdCBlPXhsKHQpO2xldCBuO3JldHVybiBuPT1udWxsJiYobj1uZXcgZmwodCksQWwuc2V0KGUsbikpLG59ZW8oe3JlbmRlclRpbGU6YXN5bmMoe3JlcXVlc3RlZFRpbGU6dCxjYW52YXM6ZSxzY2FsZUZhY3RvcjpuLC4uLnJ9KT0+e2NvbnN0IGk9ZS5nZXRDb250ZXh0KCIyZCIpO2lmKCFpKXJldHVybjtjb25zdCBvPWF3YWl0IE9sKHIpO2F3YWl0IG8ucmVuZGVyKGksdCxuLHIuY3VycmVudExheWVyKSxvLmNsZWFyQ2FjaGUoKSxhd2FpdCBuZXcgUHJvbWlzZShzPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHMpfSl9fSl9KSgpOwo=",Wz=typeof window<"u"&&window.Blob&&new Blob([atob(Uz)],{type:"text/javascript;charset=utf-8"});function UMe(){const e=Wz&&(window.URL||window.webkitURL).createObjectURL(Wz);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+Uz)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const Kh=[];function WMe(e){let t=Kh.find(n=>n.layerId===e);return t==null&&(t=ZMe(async()=>await XMe(new UMe),{size:Math.ceil(navigator.hardwareConcurrency/4)}),t.layerId=e,Kh.push(t)),t}function BMe(e,t){return WMe(t).queue(n=>e(n,t))}function YMe(e,t){const n=Kh.find(i=>i.layerId===e);return n==null||n.taskQueue.length<t}async function HMe(e){const t=Kh.findIndex(n=>n.layerId===e);t!==-1&&(await Kh[t].terminate(!0),Kh.splice(t,1))}async function jMe(e){var t;const{canvas:n,...i}=e,r=n.transferControlToOffscreen();await BMe(async o=>{await o.renderTile(DMe({canvas:r,...i},[r]))},(t=e.currentLayer)==null?void 0:t.id)}let s0;const KS=class{constructor(e){st(this,"taskCount",0),st(this,"tileCache"),st(this,"_minimumLevel"),st(this,"_maximumLevel"),st(this,"_credit"),st(this,"_resolution"),st(this,"_tilingScheme"),st(this,"_tileWidth"),st(this,"_tileHeight"),st(this,"_rectangle"),st(this,"_ready"),st(this,"_readyPromise",Promise.resolve(!0)),st(this,"_errorEvent",new M.Event),st(this,"_currentLayer"),st(this,"_useWorker"),st(this,"_urlTemplate"),st(this,"_layerNames"),st(this,"_pickPointRadius"),st(this,"_pickLineWidth"),this._minimumLevel=e.minimumLevel??0,this._maximumLevel=e.maximumLevel??24,this._credit=e.credit,this._resolution=e.resolution??10,this._tilingScheme=new M.WebMercatorTilingScheme,this._tileWidth=Wl,this._tileHeight=Wl,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=e.urlTemplate,this._layerNames=e.layerName.split(/, */).filter(Boolean),this._currentLayer=e.layer,this._useWorker=e.worker??!1,this._pickPointRadius=e.pickPointRadius,this._pickLineWidth=e.pickLineWidth}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new M.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(e,t,n){return[]}requestImage(e,t,n,i){var r;const o=this._currentLayer;if(!o||(s0&&o&&!MCe(s0,o)&&s0.id===o.id&&HMe(s0.id),s0=o,this._useWorker&&(this.taskCount>=KS.maximumTasksPerImagery||!YMe(o?.id,KS.maximumTasks))))return;const s=`${e}/${t}/${n}`;if(((r=this.tileCache)==null?void 0:r.has(s))===!0){const f=this.tileCache.get(s);return Promise.resolve(f)}const a=document.createElement("canvas"),c={x:e,y:t,level:n},l=(n>=this.maximumLevel?this._resolution:void 0)??1;a.width=this._tileWidth*l,a.height=this._tileHeight*l;const u=this._urlTemplate,h=this._layerNames,d=this._maximumLevel;return++this.taskCount,jMe({canvas:a,requestedTile:c,scaleFactor:l,urlTemplate:u,layerNames:h,maximumLevel:d,currentLayer:o,pickPointRadius:this._pickPointRadius,pickLineWidth:this._pickLineWidth}).then(()=>{var f;return(f=this.tileCache)==null||f.set(s,a),a}).catch(f=>{if(f instanceof Error&&f.message.startsWith("Unimplemented type"))return a;throw f}).finally(()=>{--this.taskCount})}async pickFeatures(e,t,n,i,r){const o={x:e,y:t,level:n},s=this._currentLayer,a=this._urlTemplate,c=this._layerNames;return await new hIe({urlTemplate:a,layerNames:c}).pickFeatures(o,i,r,s)??[]}};let JS=KS;st(JS,"maximumTasks",50),st(JS,"maximumTasksPerImagery",6);const Rb=(e,t,n)=>{const{hideIndicator:i}=n??{},{viewer:r}=$n(),o=n?.alpha;R.useEffect(()=>{if(!e||!r)return;const s=r.imageryLayers,a=s.addImageryProvider(e);return Object.assign(a,{bringToFront:()=>{s.raiseToTop(a)},sendToBack:()=>{s.lowerToBottom(a)}}),o!==void 0&&typeof o=="number"&&(a.alpha=o),xo(a,{layerId:t,hideIndicator:i}),()=>{s.remove(a)}},[e,r,t,o,i])},Ib=e=>R.useMemo(()=>{const t=Vl(e);return{type:t?.type,url:t?.url,layers:t?.layers?Array.isArray(t.layers)?t.layers.join(","):t?.layers:void 0,parameters:t?.parameters}},[e]);function Bz(e,t){if(!e)return"";let n=e.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return n.includes("/{z}/{x}/{y}.")||(n[n.length-1]!=="/"&&(n+="/"),n+="{z}/{x}/{y}."+t),n}const KMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c,layers:l}=Ib(n),u=Ds(n)||void 0,h=R.useMemo(()=>{if(!(!e||!i||!c||!l||a!=="mvt"))return new JS({minimumLevel:r,maximumLevel:o,credit:s,urlTemplate:Bz(c,"mvt"),layerName:l,layer:u,worker:!0})},[e,i,c,l,a,r,o,s,u]);Rb(h,n?.id,t)},JMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c}=Ib(n),l=R.useMemo(()=>{if(!(!e||!i||!c||a!=="tiles"))return new M.UrlTemplateImageryProvider({url:Bz(c,"png"),minimumLevel:r,maximumLevel:o,credit:s})},[e,i,c,a,r,o,s]);Rb(l,n?.id,t)},QMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c}=Ib(n),[l,u]=R.useState();R.useEffect(()=>{if(!e||!i||!c||a!=="tms")return;(async()=>u(await M.TileMapServiceImageryProvider.fromUrl(c,{minimumLevel:r,maximumLevel:o,credit:s})))()},[e,i,c,a,r,o,s]),Rb(l,n?.id,t)},qMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c,layers:l,parameters:u}=Ib(n),h=R.useMemo(()=>{if(!(!e||!i||!c||!l||a!=="wms"))return new M.WebMapServiceImageryProvider({url:c,layers:l,minimumLevel:r,maximumLevel:o,credit:s,parameters:u})},[e,i,c,l,a,r,o,s,u]);Rb(h,n?.id,t)};function $Me({isVisible:e,layer:t,property:n}){return qMe({isVisible:e,layer:t,property:n}),JMe({isVisible:e,layer:t,property:n}),QMe({isVisible:e,layer:t,property:n}),KMe({isVisible:e,layer:t,property:n}),null}const e5e=R.memo($Me,(e,t)=>vr(Ds(e.layer)?.polygon,Ds(t.layer)?.polygon)&&vr(Ds(e.layer)?.polyline,Ds(t.layer)?.polyline)&&vr(Ds(e.layer)?.marker,Ds(t.layer)?.marker)&&vr(Vl(e.layer),Vl(t.layer))&&vr(e.property,t.property)&&e.isVisible===t.isVisible&&e.evalFeature===t.evalFeature&&e.onComputedFeatureFetch===t.onComputedFeatureFetch),t5e={noFeature:!0};function Yz(e,t){const n=e.position?.getValue(t);return[n?.x??0,n?.y??0,n?.z??0]}function Mb(e,t){if(t.point||t.billboard||t.label)return{type:"Point",coordinates:Yz(t,e)};if(t.polyline)return{type:"LineString",coordinates:t.polyline?.positions?.getValue(e)?.map(o=>[o?.x??0,o?.y??0,o?.z??0])};if(t.polygon)return{type:"Polygon",coordinates:[t.polygon?.hierarchy?.getValue(e)?.positions?.map(o=>[o?.x??0,o?.y??0,o?.z??0])]}}function n5e(e,t,n,i){const r=t?.originalProperties||{};xo(e,{...t||{},originalProperties:{...r,[n]:{...r[n],...i}}})}function a0(e,t,n,i){const[r,o]=n,s=e[o]??{};if(!e[o])return;const a=Tt(e),l=(a?.originalProperties||{})[r];let u=!1;Object.entries(i).forEach(([h,d])=>{const f=d.name,p=d.type;let m=d.override??t?.[r]?.[f];const y=m==null&&!!d.default;if(m=m??d.default,!((m==null||y)&&!l)){switch(u=!0,p){case"color":m=fc(m);break;case"shadows":m=dc(m);break;case"heightReference":m=ha(m);break;case"classificationType":m=hf(m)}m!==e[o][h]&&(e[o][h]=m??s[h])}}),n5e(e,a,r,u)}const c0=(e,t,n)=>!!(Ds(e)?.[n[0]]&&t[n[1]]),Lb=e=>String(e.id),Hz=(e,t,n,i)=>{if(!t)return;const r=c0(t,e,["marker","point"]),o=c0(t,e,["marker","billboard"]),s=c0(t,e,["marker","label"]);if(e.point||e.billboard||e.label){const a=Yz(e,i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a[0],y:a[1],z:a[2]}},u=n(t.layer,l);return u?(r&&(u?.marker?.style==="point"&&!e.point&&(e.point=new M.PointGraphics,e.billboard=void 0),a0(e,u,["marker","point"],{show:{name:"show",...u?.marker?.style?{override:u?.marker?.style==="point"&&(u?.marker.show??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),o&&(u?.marker?.style==="image"&&!e.billboard&&(e.billboard=new M.BillboardGraphics,e.point=void 0),a0(e,u,["marker","billboard"],{show:{name:"show",...u?.marker?.style?{override:u?.marker?.style==="image"&&(u?.marker.show??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),s&&a0(e,u,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[l,u]):void 0}if(e.polyline){const a=e.position?.getValue(i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a?.x??0,y:a?.y??0,z:a?.z??0}},u=n(t.layer,l);return u?(c0(t,e,["polyline","polyline"])&&a0(e,u,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"},classificationType:{name:"classificationType",type:"classificationType"}}),[l,u]):void 0}if(e.polygon){const a=e.position?.getValue(i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a?.x??0,y:a?.y??0,z:a?.z??0}},u=n(t.layer,l);return u?(c0(t,e,["polygon","polygon"])&&a0(e,u,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"},classificationType:{name:"classificationType",type:"classificationType"}}),[l,u]):void 0}},i5e={kml:"kml",geojson:"geojson",czml:"czml"},r5e={kml:Lie,czml:tie,geojson:bie};function o5e({isVisible:e,property:t,layer:n,onComputedFeatureFetch:i,onComputedFeatureDelete:r}){const{show:o=!0,clampToGround:s,stroke:a,strokeWidth:c,markerColor:l,markerSize:u,fill:h,hideIndicator:d}=t??{},[f,p,m]=R.useMemo(()=>{const w=Vl(n),x=t?.type,I=t?.url;return[x??w?.type,I??w?.url,w?.time?.updateClockOnLoad??!0]},[t,n]),{viewer:y}=$n(),g=R.useRef([]),v=R.useRef(new Set),S=R.useMemo(()=>!f||f==="auto"?Rm(p):void 0,[f,p]),T=S?i5e[S]:f!=="auto"?f:void 0,C=T?r5e[T]:void 0,{requestRender:O,timelineManagerRef:V}=ai(),A=R.useCallback(w=>{if(!y)return;const x=[],I=[];w.entities.values.forEach(X=>{const D=Hz(X,n,rm,y.clock.currentTime),[Y,H]=D||[];xo(X,{layerId:n?.id,featureId:Y?.id,hideIndicator:H?.resource?.hideIndicator}),Y&&!v.current.has(Y.id)&&(x.push(Y),g.current.push({feature:Y,raw:X}),v.current.add(Y.id)),H&&I.push(H)}),f!=="geojson"&&i?.(x,I),O?.()},[n,y,i,f,O]),G=R.useCallback(w=>{w.entities.values.forEach(x=>requestAnimationFrame(()=>{const I=Tt(x);xo(x,{layerId:n?.id,featureId:Lb(x),hideIndicator:d??I?.hideIndicator})})),m&&w.clock&&V?.current?.commit({cmd:"SET_TIME",payload:{start:M.JulianDate.toDate(w.clock.startTime),stop:M.JulianDate.toDate(w.clock.stopTime),current:M.JulianDate.toDate(w.clock.currentTime)},committer:{source:"featureResource",id:n?.id}}),O?.()},[m,V,n?.id,O,d]),k=R.useMemo(()=>a?M.Color.fromCssColorString(a):void 0,[a]),N=R.useMemo(()=>h?M.Color.fromCssColorString(h):void 0,[h]),P=R.useMemo(()=>l?M.Color.fromCssColorString(l):void 0,[l]);return R.useEffect(()=>{y&&g.current.forEach(w=>{Hz(w.raw,n,rm,y.clock.currentTime)})},[n,y]),R.useEffect(()=>()=>{lC(()=>{r?.(Array.from(v.current.values()))})},[]),!e||!o||!C||!p?null:ce.jsx(C,{data:p,show:!0,clampToGround:s,onChange:A,onLoad:G,stroke:k,fill:N,strokeWidth:c,markerSize:u,markerColor:P})}const s5e={noFeature:!0},QS={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},a5e=({coordiantes:e,top:t=0,bottom:n=0,visible:i,style:r,ready:o})=>{const s=eS(()=>e?new M.PolygonHierarchy(e.map(c=>M.Cartesian3.fromDegrees(c[0],c[1],c[2]??0))):void 0,[e??[]],vr),a=R.useMemo(()=>({...QS,...r,fillColor:ei(r?.fillColor??QS.fillColor),strokeColor:ei(r?.strokeColor??QS.strokeColor)}),[r]);return ce.jsx(zr,{hideIndicator:!0,children:ce.jsx(zM,{hierarchy:s,fill:a.fill,material:a.fillColor,outline:a.stroke,outlineColor:a.strokeColor,outlineWidth:a.strokeWidth,height:n,extrudedHeight:t,show:i&&o})})},c5e=e=>{const t=R.useRef(e);return t.current=e,t},jz=e=>{const t=R.useRef(e),n=R.useCallback(()=>t.current,[]);return R.useEffect(()=>{t.current=e},[e]),n};class l5e{records=new Map;constructor(){}has(t){return this.records.has(t)}find(t){}}class u5e extends l5e{has(t){return this.records.has(t)}find(t){const n=this.records.get(t);if(n!=null)return n.map(({content:i,batchId:r})=>i.getFeature(r))}addFeature(t,n,i){if(i==null)return;const r=this.records.get(i);r==null?this.records.set(i,[{content:t,batchId:n}]):r.push({content:t,batchId:n})}deleteFeature(t){t!=null&&this.records.has(t)&&this.records.delete(t)}}const h5e=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],d5e=({clipping:e,boxId:t})=>{const{useBuiltinBox:n,visible:i,allowEnterGround:r,coordinates:o,width:s,height:a,length:c,heading:l,pitch:u,roll:h,disabledSelection:d}=e||{},{viewer:f}=$n(),p=R.useRef(!1),m=R.useRef(!1),y=R.useRef(void 0),[g,v]=R.useState(o);R.useEffect(()=>{n&&!g&&v(o)},[g,o,n]);const[S,T]=R.useState({width:s,height:a,length:c,heading:l,pitch:u,roll:h});R.useEffect(()=>{n&&!S&&T({width:s,height:a,length:c,heading:l,pitch:u,roll:h})},[S,s,a,c,l,u,h,n]);const[C,O]=R.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),V=R.useCallback(J=>{O(z=>({...z,...J}))},[]),A=R.useCallback(J=>{if(!f||!d)return;const z=f.scene.pick(J.position),W=qS(z);if(W?.startsWith(`${t}-scale-point`)){const Q=Number(W.split("-").slice(-1)[0]);V({cursor:"nesw-resize",activeScalePointIndex:Q,isScalePointClicked:!0})}if(W?.startsWith(`${t}-edge-draggable`)){const Q=Number(W.split("-").slice(-1)[0]);V({cursor:"grabbing",activeEdgeIndex:Q,isEdgeClicked:!0})}if(W?.startsWith(`${t}-plane`)&&(p.current=!0,m.current=W.endsWith("top")||W.endsWith("bottom")),p.current){const Q=lo(f);y.current=Q,Yu(f,!1),(!C.isScalePointClicked||!C.isEdgeClicked)&&V({cursor:"grabbing",activeBox:!0})}},[t,C,V,f,d]),G=R.useCallback(()=>{!f||!d||((C.activeScalePointIndex||C.activeEdgeIndex)&&V({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),p.current&&(Yu(f,!0),y.current=void 0,p.current=!1,m.current=!1,C.activeBox=!1,C.cursor="default",V({activeBox:!1,cursor:"default"})))},[C,V,f,d]),k=R.useRef(0),N=R.useCallback(async J=>{if(!p.current||!f||!d)return;const z=M.Cartesian3.fromDegrees(g?.[0]||0,g?.[1]||0,g?.[2]);if(m.current){const W=g?.[2]||0,Q=(()=>{if(!r){const fe=W-(S?.height||0)/2,Xe=k.current;if(fe<Xe)return W+(Xe-fe)}})(),q=new M.Cartesian2(J.startPosition.x,J.startPosition.y),se=new M.Cartesian2(J.endPosition.x,J.endPosition.y),Ce=M.Cartesian2.subtract(se,q,new M.Cartesian2),_e=new M.Cartesian3(0,0,Ce.y<0?-1:1),{moveAmount:Ve}=s1e(f.scene,{startPosition:q,endPosition:se},z,_e),Ae=M.Cartesian3.multiplyByScalar(_e,Ve,new M.Cartesian3);v(fe=>[fe?.[0]||0,fe?.[1]||0,(Q||fe?.[2]||0)+Ae.z])}else{const W=J.endPosition?Yv(f.scene,J.endPosition.x,J.endPosition.y,!r):void 0;v(Q=>[W?.lng||0,W?.lat||0,(r?Q?.[2]:W?.height)||0]),Bu(f.scene,g?.[0]||0,g?.[1]||0).then(Q=>{k.current=Q||0})}},[r,g,S?.height,f,d]),P=R.useCallback(({layerId:J}={})=>{const z=!C.isScalePointClicked&&!C.isEdgeClicked&&!p.current;if(J?.startsWith(`${t}-scale-point`)&&z){const W=Number(J.split("-").slice(-1)[0]);V({cursor:"nesw-resize",activeScalePointIndex:W})}if(J?.startsWith(`${t}-edge-draggable`)&&z){const W=Number(J.split("-").slice(-1)[0]);V({cursor:"grab",activeEdgeIndex:W})}J?.startsWith(`${t}-plane`)&&z&&V({cursor:"grab",activeBox:!0})},[t,C.isEdgeClicked,C.isScalePointClicked,V]),w=R.useCallback(({layerId:J}={})=>{const z=!C.isScalePointClicked&&!C.isEdgeClicked&&!p.current;J?.startsWith(`${t}-scale-point`)&&z&&V({cursor:"default",activeScalePointIndex:void 0}),J?.startsWith(`${t}-edge-draggable`)&&z&&V({cursor:"default",activeEdgeIndex:void 0}),J?.startsWith(`${t}-plane`)&&z&&V({cursor:"default",activeBox:!1})},[t,C.isEdgeClicked,C.isScalePointClicked,V]),x=R.useRef(void 0),I=R.useCallback(J=>{const z=f?.scene.pick(J.endPosition);if(x.current!==z){if(x.current){const W=qS(x.current);w({layerId:W}),w()}if(z){const W=qS(z);P({layerId:W}),P()}}N(J),x.current=z},[P,w,N,f?.scene]),X=R.useCallback(J=>{if(J.layerId?.startsWith(`${t}-scale-point`)&&J.scale){const z=J.scale;T(W=>({...W,width:z.width,height:z.height,length:z.length})),v([z.location.lng,z.location.lat,z.location.height])}if(J.layerId?.startsWith(`${t}-edge-draggable`)&&J.rotate){const z=J.rotate;T(W=>({...W,heading:z.heading,pitch:z.pitch,roll:z.roll}))}},[t]),D=R.useMemo(()=>new M.ScreenSpaceEventHandler(f?.scene.canvas),[f]);R.useEffect(()=>{D.setInputAction(A,M.ScreenSpaceEventType.LEFT_DOWN),D.setInputAction(I,M.ScreenSpaceEventType.MOUSE_MOVE),D.setInputAction(G,M.ScreenSpaceEventType.LEFT_UP)},[D,A,I,G]),R.useEffect(()=>()=>{requestAnimationFrame(()=>{D.isDestroyed()||D.destroy()})},[D]);const Y=R.useMemo(()=>({...C,...S,allowEnterGround:r}),[C,S,r]),H=R.useMemo(()=>n?{visible:i,handleLayerEdit:X,geometry:{type:"Point",coordinates:g||o||[0,0,0]},property:Y}:void 0,[Y,o,g,X,n,i]);return{...e,planes:n?h5e:e?.planes,width:n?S?.width:e?.width,height:n?S?.height:e?.height,length:n?S?.length:e?.length,heading:n?S?.heading:e?.heading,pitch:n?S?.pitch:e?.pitch,roll:n?S?.roll:e?.roll,coordinates:n?g:e?.coordinates,builtinBoxProps:H}};function qS(e){if(e&&"id"in e&&e.id instanceof M.Entity)return Tt(e.id)?.layerId;if(e&&e instanceof M.Cesium3DTileFeature)return Tt(e.tileset)?.layerId}const f5e=({enabled:e,surfacePoints:t,direction:n="inside",top:i,bottom:r,visible:o=!0,style:s,tilesetRef:a,viewer:c,clippingPlanes:l,isTilesetReady:u})=>{const[h,d]=R.useState(0),f=R.useMemo(()=>i??100,[i]),p=R.useMemo(()=>r??10,[r]),[m,y]=R.useState(!1),{requestRender:g}=ai();R.useEffect(()=>{(async()=>{if(!a?.current||!u)return;if(!e||!t||t?.length<2){l.removeAll(),d(0),g?.();return}l.modelMatrix=M.Matrix4.IDENTITY.clone(),y(!1);const T=sl([t.map(G=>[G.lng,G.lat])]),C=I1e(T),O=c?.scene?await Bu(c?.scene,C.geometry.coordinates[0],C.geometry.coordinates[1])??0:0;d(O);const V=M.Matrix4.inverse(M.Transforms.eastNorthUpToFixedFrame(a.current.boundingSphere.center),new M.Matrix4);let A=0;for(let G=0;G<t.length;G++){const k=t[G],N=t[(G+1)%t.length];A+=(N.lng-k.lng)*(N.lat+k.lat)}A>0&&t.reverse(),l.removeAll();for(let G=0;G<t.length-1;G++){const k=t[G],N=t[G+1];l.add(p5e(k,N,V,n))}l.add(Kz(t[0],O+f,V,n==="inside"?1:-1)),l.add(Kz(t[0],O-p,V,n==="inside"?-1:1)),y(!0)})()},[t,a,l,f,p,e,n,c,u,g]),R.useEffect(()=>{l.unionClippingRegions=n==="outside"},[l,n,e]);const v=R.useMemo(()=>({coordiantes:t?.map(S=>[S.lng,S.lat])??[],top:h+f,bottom:h-p,visible:o,style:s,ready:m}),[t,h,f,p,o,s,m]);return{drawClippingEnabled:e,drawClippingEdgeProps:v}},$S=(e,t,n)=>{const i=M.Cartesian3.fromDegrees(e.lng,e.lat,n);return M.Matrix4.multiplyByPoint(t,i,new M.Cartesian3)},p5e=(e,t,n,i)=>{const r=$S(e,n),o=$S(t,n),s=new M.Cartesian3(0,0,1),a=new M.Cartesian3(0,0,-1),c=M.Cartesian3.subtract(o,r,new M.Cartesian3),l=i==="inside"?M.Cartesian3.normalize(M.Cartesian3.cross(c,s,new M.Cartesian3),new M.Cartesian3):M.Cartesian3.normalize(M.Cartesian3.cross(c,a,new M.Cartesian3),new M.Cartesian3),u=M.Plane.fromPointNormal(r,l);return M.ClippingPlane.fromPlane(u)},Kz=(e,t,n,i)=>{const r=$S(e,n,t),o=new M.Cartesian3(0,0,i),s=M.Plane.fromPointNormal(r,o);return M.ClippingPlane.fromPlane(s)},Jz=M.Color.WHITE,m5e=e=>R.useMemo(()=>{const t=Vl(e);return{type:t?.type,url:t?.url,idProperty:t?.idProperty,layers:t?.layers?Array.isArray(t.layers)?t.layers.join(","):t?.layers:void 0,googleMapApiKey:t?.serviceTokens?.googleMapApiKey,provider:t?.provider}},[e]),Qz=(e,t,n)=>{const i=t.tile.boundingSphere.center,r=n&&!(e instanceof M.Model)?e.getProperty(n):void 0;if(r)return r;const o=y5e(e);return Ty(`${i.x}-${i.y}-${i.z}-${o}-${e instanceof M.Model?"":JSON.stringify(Object.entries(Mp(e)).filter((s,a)=>typeof a=="string"||typeof a=="number").map(([s,a])=>`${s}${a}`))}`)},g5e=(e,t,n)=>{const i=t.tile.boundingSphere.center;return{type:"feature",id:Qz(e,t,n),geometry:{type:"Point",coordinates:[i.x,i.y,i.z]},range:{x:i.x,y:i.y,z:i.z}}},y5e=e=>(e instanceof M.Model?e.id:e instanceof M.Cesium3DTileFeature?e.featureId:"")??"",b5e=5e3,_5e=[{name:"color",convert:"color"},{name:"show"}],v5e=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],w5e=[{name:"pointSize"}],x5e=["show","color","pointSize","meta"],eE=(e,t)=>t==="color"?ei(e):t==="colorFunctionString"?e===void 0?e:`color("${e}")`:e,S5e=({id:e,tilesetRef:t,idProperty:n,layer:i,viewer:r,featureIndex:o,selectedFeatureIdsRef:s,evalFeature:a,onComputedFeatureFetch:c,shouldUseFeatureIndex:l,isTilesetReady:u,useExternalStyle:h})=>{const d=R.useRef([]),f=R.useRef(i),p=R.useRef(new Set),m=i?.id||e,y=c5e(m),g=R.useCallback(async x=>{const I=f?.current?.layer;if(I?.type==="simple"&&x?.feature){const X=x.raw,D=Tt(X),Y=r&&!(X instanceof M.Model)?Mp(X):{},H=l?s.current.includes(D?.featureId??""):D?.isFeatureSelected,J=a(I,{...x?.feature,properties:Y});if(!h){const z=J?.["3dtiles"];_5e.forEach(({name:W,convert:Q})=>{const q=eE(z?.[W],Q);W==="color"?(X.color=Jz,q!==void 0&&(X.color=q),H&&typeof I["3dtiles"]?.selectedFeatureColor=="string"&&(X.color=ei(I["3dtiles"]?.selectedFeatureColor)??q)):q!==void 0&&(X[W]=q)}),X instanceof M.Cesium3DTilePointFeature&&w5e.forEach(({name:W,convert:Q})=>{const q=eE(z?.[W],Q);q!==void 0&&(X[W]=q)}),"style"in X&&(X.style=new M.Cesium3DTileStyle(v5e.reduce((W,{name:Q,convert:q})=>{const se=eE(z?.[Q],q);return se===void 0?W:{...W,[Q]:se}},{})))}return xo(x.raw,{layerId:m,featureId:x.feature.id,computedFeature:J,isFeatureSelected:D?.isFeatureSelected}),J}},[a,m,r,l,s,h]),v=R.useCallback(async x=>{if(x.tileset.isDestroyed())return;const I=new Set;await Ip(x.content,async(X,D,Y)=>{const H={feature:g5e(X,D,n),raw:X};xo(H.raw,{layerId:y.current,featureId:H.feature.id}),Y!=null&&l&&o.addFeature(D,Y,H.feature.id),await g(H),d.current.push(H),p.current.add(H.feature.id),I.add(Yr(H.feature,["id","type","range"]))}),c?.(Array.from(I.values()),[])},[d,g,c,n,o,l,y]),S=R.useRef(v);S.current=v,R.useEffect(()=>t.current?.tileLoad.addEventListener(x=>S.current(x)),[t,u]);const T=R.useCallback(async x=>{x.tileset.isDestroyed()||!l||await Ip(x.content,async(I,X)=>{o.deleteFeature(Qz(I,X,n))})},[n,o,l]),C=R.useRef(T);C.current=T,R.useEffect(()=>t.current?.tileUnload.addEventListener(x=>C.current(x)),[t,u]),R.useEffect(()=>{f.current=i},[i]);const O=R.useMemo(()=>Ds(i)?.["3dtiles"],[i]),V=$be(O,x5e),A=l?0:i?.layer._updateStyle,G=R.useRef(A),k=R.useRef(void 0);R.useEffect(()=>{k.current=Date.now()},[V,A]);const N=R.useCallback(async(x,I)=>new Promise(X=>requestAnimationFrame(()=>{if(k.current&&k.current>I){X(void 0);return}(V||A)&&g(x),X(void 0)})),[V,g,A]),P=R.useCallback(async x=>{const I=[];let X=!1;for(const D of d.current){if(k.current&&k.current>x){X=!0;break}I.push(N(D,x)),I.length>b5e&&(await Promise.all(I),I.length=0)}X||await Promise.all(I),G.current=A,I.length=0},[N,A]),{requestRender:w}=ai();R.useEffect(()=>{(async()=>{const I=Date.now();await P(I),w?.()})()},[P,w,A])},E5e=({id:e,boxId:t,isVisible:n,property:i,viewerProperty:r,layer:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l})=>{const{viewer:u}=$n(),h=R.useRef(void 0),{onLayerLoad:d,updateCredits:f,customProvider:p}=ai(),m=R.useRef(o?.id);m.current=o?.id;const{tileset:y,styleUrl:g,edgeColor:v,edgeWidth:S,experimental_clipping:T,selectedFeatureColor:C,disableIndexingFeature:O}=i??{},{width:V,height:A,length:G,location:k,coordinates:N,heading:P,roll:w,pitch:x,planes:I,visible:X=!0,direction:D="inside",builtinBoxProps:Y,allowEnterGround:H}=d5e({clipping:T,boxId:t}),[J,z]=R.useState(),{url:W,type:Q,idProperty:q,googleMapApiKey:se,provider:Ce}=m5e(o),_e=!O&&!!q,[Ve,Ae]=R.useState(!1),[fe,Xe]=R.useState(!1),[nt,it]=R.useState(!1),Z=R.useRef(I),pe=R.useMemo(()=>((!Z.current?.length||!Z.current?.every(($e,xt)=>$e.normal?.x===I?.[xt].normal?.x&&$e.normal?.y===I?.[xt].normal?.y&&$e.normal?.z===I?.[xt].normal?.z&&$e.distance===I?.[xt].distance))&&(Z.current=I),Z.current),[I]),he=D==="inside"?-1:1,[$,j]=R.useState(()=>new M.ClippingPlaneCollection({planes:pe?.map($e=>new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he)),unionClippingRegions:D==="outside",edgeWidth:S,edgeColor:ei(v)}));R.useEffect(()=>()=>{j(new M.ClippingPlaneCollection({planes:pe?.map($e=>new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he)),unionClippingRegions:D==="outside",edgeWidth:S,edgeColor:ei(v)}))},[]);const{drawClippingEnabled:ee,drawClippingEdgeProps:le}=f5e({...T?.draw,tilesetRef:h,viewer:u,clippingPlanes:$,isTilesetReady:Ve}),[ge]=R.useState(()=>new u5e),te=R.useCallback($e=>{$e?.cesiumElement&&xo($e.cesiumElement,{layerId:o?.id||e,featureIndex:_e?ge:void 0,appearanceType:"3dtiles"}),o?.id&&$e?.cesiumElement&&(($e?.cesiumElement)[Woe]=o.id),h.current=$e?.cesiumElement,it(!!$e?.cesiumElement)},[e,o?.id,ge,_e]),ue=R.useRef([]),Re=R.useRef(C);Re.current=C;const[ye]=R.useState(()=>new Map);R.useEffect(()=>{!h.current||!_e||!Ve||Object.assign(h.current,{onSelectFeature:$e=>{const xt=Tt($e);xt?.featureId&&(ue.current.push(xt.featureId),ye.set(xt.featureId,$e.color)),Re.current&&($e.color=ei(Re.current)??$e.color)},onUnselectFeature:$e=>{const xt=Tt($e);xt?.featureId&&(ue.current=ue.current.filter(mn=>mn!==xt.featureId)),$e.color=ye.get(xt?.featureId??"")??Jz}})},[ye,ge,_e,Ve]),S5e({id:e,tilesetRef:h,layer:o,idProperty:q,viewer:u,evalFeature:a,onComputedFeatureFetch:c,featureIndex:ge,selectedFeatureIdsRef:ue,shouldUseFeatureIndex:_e,isTilesetReady:Ve,useExternalStyle:!!g});const[Ue,We]=R.useState(0),qe=R.useRef(!1),Xt=R.useCallback($e=>{qe.current||!u||H||(qe.current=!0,T5(u.scene,$e).then(xt=>{We(xt??0),qe.current=!1}))},[H,u]);R.useEffect(()=>{if(T?.draw)return;const $e=N||(k?[k.lng,k.lat,k.height??0]:void 0),xt=M.Cartesian3.fromDegrees($e?.[0]||0,$e?.[1]||0,$e?.[2]||0);(async()=>{if(!h.current||!Ve)return;const kn=h.current.clippingPlanesOriginMatrix.clone(),Jn=new M.Cartesian3(V||100,G||100,A||100);if(!H){const rr=new M.TranslationRotationScale(xt,void 0,Jn);CF(rr,!!H,Ue),xt.x=rr.translation.x,xt.y=rr.translation.y,xt.z=rr.translation.z}const Ni=P&&x&&w?new M.HeadingPitchRoll(P,x,w):void 0,ir=M.Matrix4.multiply(Ni?M.Matrix4.fromRotationTranslation(M.Matrix3.fromHeadingPitchRoll(Ni),xt):M.Transforms.eastNorthUpToFixedFrame(xt),M.Matrix4.fromScale(Jn,new M.Matrix4),new M.Matrix4),Ha=M.Matrix4.inverse(kn,new M.Matrix4);M.Matrix4.multiply(Ha,ir,$.modelMatrix)})(),H||Xt(xt)},[V,G,A,P,x,w,k,N,$.modelMatrix,Xt,H,Ue,T?.draw,Ve]),R.useEffect(()=>{T?.draw||($.enabled=X)},[$,X,T?.draw]),R.useEffect(()=>{T?.draw||($.unionClippingRegions=D==="outside")},[$,D,T?.draw]),R.useEffect(()=>{T?.draw||($.removeAll(),pe?.forEach($e=>$.add(new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he))))},[pe,$,he,T?.draw]),R.useEffect(()=>{if(!g){z(void 0);return}(async()=>{const $e=await fetch(g);if(!$e.ok){console.warn("Failed to fetch style from:",g);return}const xt=await $e.json(),mn=new M.Cesium3DTileStyle(xt);z(mn)})()},[g]),R.useEffect(()=>{J&&h.current&&Ve&&(h.current.style=J)},[J,Ve]);const Be=R.useMemo(()=>Q!=="google-photorealistic"||!n?null:Ce==="reearth"?p?.layers?.providers?.find(mn=>mn.id==="reearth_google_photorealistic_3d_tiles")?.url||W||null:(async()=>{try{return Ce==="cesium-ion"||!se?await M.IonResource.fromAssetId(2275207,{accessToken:s?.cesiumIonAccessToken}):(await M.createGooglePhotorealistic3DTileset({key:se})).resource}catch(xt){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${xt}`),xt}})(),[Q,n,se,s?.cesiumIonAccessToken,Ce,p,W]),St=R.useMemo(()=>n?Be||(Q==="reearth-buildings"?W??"https://buildings.reearth.land/tileset.json":Q==="osm-buildings"?M.IonResource.fromAssetId(96188,{accessToken:s?.cesiumIonAccessToken}):Q==="3dtiles"?W??y??null:null):null,[Q,n,Be,W,y,s?.cesiumIonAccessToken]),Dt=R.useMemo(()=>{if(!i?.specularEnvironmentMaps&&!i?.sphericalHarmonicCoefficients&&!r?.scene?.imageBasedLighting?.specularEnvironmentMaps&&!r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients)return;const $e=new M.ImageBasedLighting,xt=i?.specularEnvironmentMaps??r?.scene?.imageBasedLighting?.specularEnvironmentMaps,mn=i?.imageBasedLightIntensity??r?.scene?.imageBasedLighting?.intensity,kn=Jx(i?.sphericalHarmonicCoefficients??r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,mn);return xt&&($e.specularEnvironmentMaps=xt),kn&&($e.sphericalHarmonicCoefficients=kn),$e},[i?.specularEnvironmentMaps,i?.sphericalHarmonicCoefficients,i?.imageBasedLightIntensity,r?.scene?.imageBasedLighting?.specularEnvironmentMaps,r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,r?.scene?.imageBasedLighting?.intensity]),Et=R.useCallback($e=>{Xe(!0),l?.({properties:$e.properties}),d?.({layerId:m.current})},[l,d]);return R.useEffect(()=>{!fe||!nt||Ae(!0)},[fe,nt]),R.useEffect(()=>(f?.(),()=>{f?.()}),[Q,f]),{tilesetUrl:St,ref:te,style:J,clippingPlanes:$,drawClippingEnabled:ee,drawClippingEdgeProps:le,builtinBoxProps:Y,imageBasedLighting:Dt,handleReady:Et}};function T5e({id:e,isVisible:t,property:n,layer:i,feature:r,viewerProperty:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l,...u}){const{shadows:h,colorBlendMode:d,pbr:f,showWireframe:p,showBoundingVolume:m,cacheBytes:y}=n??{},g=`${i?.id}_box`,{tilesetUrl:v,ref:S,style:T,clippingPlanes:C,drawClippingEnabled:O,drawClippingEdgeProps:V,builtinBoxProps:A,imageBasedLighting:G,handleReady:k}=E5e({id:e,boxId:g,isVisible:t,layer:i,property:n,viewerProperty:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l}),N=R.useMemo(()=>({...i?.layer?.type==="simple"?i?.layer?.box:{},...A?.property||{}}),[i?.layer,A?.property]),P=R.useMemo(()=>({...i,id:g}),[i,g]);return!t||!v?null:ce.jsxs(ce.Fragment,{children:[ce.jsx(Wne,{ref:S,url:v,customShader:f===!1?P4:f==="withTexture"?L4:void 0,cacheBytes:y,style:T,shadows:dc(h),clippingPlanes:C,colorBlendMode:$oe(d),imageBasedLighting:G,onReady:k,debugWireframe:p,debugShowBoundingVolume:m}),A&&ce.jsx(VF,{...u,id:g,viewerProperty:o,property:N,geometry:A.geometry,feature:r,layer:P,isVisible:A.visible,evalFeature:a,onLayerEdit:A.handleLayerEdit}),O&&ce.jsx(a5e,{...V})]})}const C5e=R.memo(T5e,(e,t)=>e.id===t.id&&e.isVisible===t.isVisible&&e.property===t.property&&e.layer?.layer===t.layer?.layer&&e.viewerProperty===t.viewerProperty&&e.meta===t.meta&&e.evalFeature===t.evalFeature&&e.onComputedFeatureFetch===t.onComputedFeatureFetch&&e.onFeatureDelete===t.onFeatureDelete),R5e={noFeature:!0},I5e=["transition"],M5e=e=>!I5e.includes(e),l0={marker:[a2e,c2e],polyline:[I2e,M2e],polygon:[C2e,R2e],ellipsoid:[y1e,b1e],ellipse:[m1e,g1e],model:[u2e,h2e],"3dtiles":[C5e,R5e],box:[VF,p1e],photooverlay:[b2e,w2e],resource:[o5e,s5e],raster:[e5e,t5e],heatMap:[i2e,o2e],frustum:[T1e,C1e]},L5e={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"reearth-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},P5e=["raster","3dtiles"],qz=(e,t)=>{if(P5e.includes(e)&&t.layer.type==="simple")return t.layer[e]},$z=new Zbe({max:1e4}),O5e=6e3;function G5e({layer:e,isHidden:t,sketchEditingFeature:n,...i}){const r=Vl(e),o=!r?.type||r.type==="auto"?Rm(r?.url):void 0;let s=r?.type&&L5e[o??r.type];(e.features?.length>O5e||r?.geojson?.useAsResource)&&(s=["resource"]);const a=Array.isArray(s)&&s.every(p=>l0[p][1].noFeature&&!l0[p][1].noLayer),c=!!e?.transition?.useTransition,l=!r?.updateInterval&&!c,u=R.useMemo(()=>r?.url?Ty(r.url):"",[r?.url]),{requestRender:h}=ai();R.useEffect(()=>{setTimeout(()=>{h?.()},300)}),R.useEffect(()=>()=>h?.(),[h]);const d=(p,m)=>{if(!M5e(p))return null;const y=!!i.viewerProperty?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,g=!!i.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps,v=e.layer.visible!==!1&&!t&&!(n?.layerId===e.id&&n?.feature?.id===m?.id),S=u+Ty(`${e.id}_${m?.id??""}_${p}_${v}_${y}_${g}_${JSON.stringify(m?.[p])??""}_${JSON.stringify(e.transition)??""}_${JSON.stringify(m?.geometry)??""}`);if(l){const T=$z.get(S);if(l&&T)return T}try{const[T,C]=l0[p]??[];if(!T||m&&!m[p]||C.noLayer&&!m||C.noFeature&&m||Array.isArray(s)&&!s.includes(p)||!Array.isArray(s)&&s!=="auto"||r?.type==="geojson"&&s==="auto"&&p==="resource")return null;const O=R.createElement(T,{...i,key:c?void 0:S,id:c?m?.id??e.id:S,property:m?m[p]:e[p]||qz(p,e),geometry:m?.geometry,feature:m,layer:e,isVisible:v});return l&&$z.set(S,O),O}catch(T){return console.error(`Error rendering component ${S}`,T),null}},f=R.useMemo(()=>!a||!s||!Array.isArray(s)?null:ce.jsx(ce.Fragment,{children:s.map(p=>{const[m]=l0[p]??[],y=e.layer.visible!==!1&&!t,g=!!i.viewerProperty?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,v=!!i.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps,S=e?.layer?.type==="simple"&&!!e?.layer?.["3dtiles"]?.sphericalHarmonicCoefficients,T=e?.layer?.type==="simple"&&!!e?.layer?.["3dtiles"]?.specularEnvironmentMaps,C=u+Ty(`${e?.id||""}_${p}_${y}_${g}_${v}_${S}}_${T}`);return R.createElement(m,{...i,key:C,id:`${e.id}_${p}`,property:qz(p,e)||e[p],layer:e,isVisible:y})})}),[a,s,e,t,u,i]);return ce.jsx(ce.Fragment,{children:f||[void 0,...e.features].flatMap(p=>Object.keys(l0).map(m=>d(m,p)))})}function V5e(){return window.REEARTH_E2E_ACCESS_TOKEN}function eN(e){e?window.REEARTH_E2E_CESIUM_VIEWER=e:delete window.REEARTH_E2E_CESIUM_VIEWER}const tN=1e6,nN=1e6;function F5e(e,t,n){const i=R.useMemo(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()||!n?.enabled||!n.targetArea?.lng||!n.targetArea.lat))return z5e(a,n.targetArea.lng,n.targetArea.lat)},[e,n?.enabled,n?.targetArea?.lng,n?.targetArea?.lat]),r=R.useMemo(()=>{if(!i)return;const a=typeof n?.targetWidth=="number"?n.targetWidth:tN,c=typeof n?.targetLength=="number"?n.targetLength:nN,{cartesianArray:l,cartographicDimensions:u}=iN(i,c/2,a/2);return{cartographicDimensions:u,cartesianArray:l}},[n?.targetWidth,n?.targetLength,i]),[o,s]=R.useState();return R.useEffect(()=>{const a=e.current?.cesiumElement;if(!a||a.isDestroyed()||!n?.targetArea||!i)return;const c=new M.Camera(a.scene);c.setView({destination:M.Cartesian3.fromDegrees(n.targetArea.lng,n.targetArea.lat,n.targetArea.height),orientation:{heading:n?.targetArea.heading,pitch:n?.targetArea.pitch,roll:n?.targetArea.roll,up:c.up}});const l=c.computeViewRectangle();if(!l)return;const u=M.Rectangle.computeWidth(l)*M.Math.PI*1e6,h=M.Rectangle.computeHeight(l)*M.Math.PI*1e6,{targetWidth:d=tN,targetLength:f=nN}=n??{},{cartesianArray:p}=iN(i,f/2+h,d/2+u);s(p)},[e,n,i]),R.useEffect(()=>{const a=e?.current?.cesiumElement,c=lo(e?.current?.cesiumElement);!a||a.isDestroyed()||!c||!n?.enabled||!r||a.camera.setView({destination:N5e(c,r),orientation:{heading:a.camera.heading,pitch:a.camera.pitch,roll:a.camera.roll,up:a.camera.up}})},[t,e,n,r]),{cameraViewBoundaries:r?.cartesianArray,cameraViewOuterBoundaries:o,cameraViewBoundariesMaterial:A5e}}const A5e=new M.PolylineDashMaterialProperty({color:M.Color.RED}),z5e=(e,t,n)=>{const i=e.scene.globe.ellipsoid,r=M.Cartesian3.fromDegrees(t,n,0),o=M.Cartographic.fromCartesian(r),s=i.geodeticSurfaceNormal(r),a=M.Cartesian3.normalize(M.Cartesian3.cross(M.Cartesian3.UNIT_Z,s,new M.Cartesian3),new M.Cartesian3),c=M.Cartesian3.normalize(M.Cartesian3.cross(s,a,new M.Cartesian3),new M.Cartesian3),l=new M.EllipsoidGeodesic(o,M.Cartographic.fromCartesian(c),i),u=new M.EllipsoidGeodesic(o,M.Cartographic.fromCartesian(a),i);return{vertical:l,horizontal:u}},iN=(e,t,n)=>{const i=e.vertical.interpolateUsingSurfaceDistance(t),r=e.vertical.interpolateUsingSurfaceDistance(-t),o=e.horizontal.interpolateUsingSurfaceDistance(n),s=e.horizontal.interpolateUsingSurfaceDistance(-n),a=new M.Cartographic(o.longitude,i.latitude,0),c=new M.Cartographic(s.longitude,i.latitude,0),l=new M.Cartographic(o.longitude,r.latitude,0),u=new M.Cartographic(s.longitude,r.latitude,0);return{cartographicDimensions:{rightDimension:o,leftDimension:s,topDimension:i,bottomDimension:r},cartesianArray:[M.Cartographic.toCartesian(a),M.Cartographic.toCartesian(c),M.Cartographic.toCartesian(u),M.Cartographic.toCartesian(l),M.Cartographic.toCartesian(a)]}},N5e=(e,t)=>{const n=M.Cartographic.fromDegrees(e?.lng,e?.lat,e?.height),i=new M.Cartographic(M.Math.clamp(n.longitude,t.cartographicDimensions.leftDimension.longitude,t.cartographicDimensions.rightDimension.longitude),M.Math.clamp(n.latitude,t.cartographicDimensions.bottomDimension.latitude,t.cartographicDimensions.topDimension.latitude),n.height);return M.Cartographic.toCartesian(i)},k5e=({cesium:e,property:t,camera:n,featureFlags:i,engineAPI:r,cameraForceHorizontalRoll:o=!1,onCameraChange:s})=>{const a=R.useRef([]),c=R.useCallback(()=>{const v=e?.current?.cesiumElement;if(!v||v.isDestroyed()||!s)return;const S=lo(v);S&&!vr(S,n)&&(a.current.push(S),a.current.length>10&&a.current.shift(),s?.(S))},[e,n,s]),l=R.useCallback(()=>{c()},[c]),u=R.useCallback(()=>{c()},[c]);R.useEffect(()=>{n&&!a.current.includes(n)&&(r.flyTo(n,{duration:0}),a.current=[])},[n,r]),R.useEffect(()=>{if(!e.current?.cesiumElement)return;const v=!!(i&Gn.CAMERA_MOVE),S=!!(i&Gn.CAMERA_ZOOM),T=!!(i&Gn.CAMERA_TILT),C=!!(i&Gn.CAMERA_LOOK);e.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=v,e.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=v,e.current.cesiumElement.scene.screenSpaceCameraController.enableLook=C,e.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=T,e.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=S},[e,i]);const h=R.useRef(!1),d=E2e(()=>{h.current||(h.current=!0,t?.camera?.limiter?.enabled&&t?.camera?.limiter?.targetArea?r.flyTo(t?.camera?.limiter?.targetArea,{duration:0}):n&&r.flyTo(n,{duration:0}))},[r,t?.camera?.limiter?.enabled],(v,S)=>v[0]===S[0]&&v[1]===S[1]),f=R.useCallback(()=>{h.current=!1},[]),{cameraViewBoundaries:p,cameraViewOuterBoundaries:m,cameraViewBoundariesMaterial:y}=F5e(e,n,t?.camera?.limiter),g=R.useCallback(v=>{!v.camera||!o||Math.abs(M.Math.negativePiToPi(v.camera.roll))>Math.PI/86400&&v.camera.setView({orientation:{heading:v.camera.heading,pitch:v.camera.pitch,roll:0}})},[o]);return R.useEffect(()=>{const v=e.current?.cesiumElement;if(v)return v.scene.preRender.addEventListener(g)},[e,g]),{cameraViewBoundaries:p,cameraViewOuterBoundaries:m,cameraViewBoundariesMaterial:y,mountCamera:d,unmountCamera:f,handleCameraChange:l,handleCameraMoveEnd:u}},u0=new M.Color;function X5e(e){const t=e.width??1,n=e.height??1,i=this._context,r=i.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),o=new Set;for(let s=0;s<r.length;s+=4)try{u0.red=M.Color.byteToFloat(r[s]),u0.green=M.Color.byteToFloat(r[s+1]),u0.blue=M.Color.byteToFloat(r[s+2]),u0.alpha=M.Color.byteToFloat(r[s+3]);const a=i.getObjectByPickColor(u0);a!=null&&o.add(a)}catch(a){console.error(a)}return Array.from(o.values())}const Z5e=new M.PerspectiveOffCenterFrustum,D5e=new M.Cartesian2;function U5e(e,t,n,i,r){const o=e.camera,s=o.frustum;Vn(s instanceof M.PerspectiveFrustum),Vn(s.fovy!==void 0),Vn(s.aspectRatio!==void 0);const a=s.near,c=Math.tan(s.fovy/2),l=s.aspectRatio*c,u=t.x,h=t.y,d=2*(u-r.x)/r.width-1,f=2*(r.height-h-r.y)/r.height-1,p=d*a*l,m=f*a*c,y=s.getPixelDimensions(r.width,r.height,a,PF(e),D5e),g=y.x*n/2,v=y.y*i/2,S=Z5e;return S.top=m+v,S.bottom=m-v,S.right=p+g,S.left=p-g,S.near=a,S.far=s.far,S.computeCullingVolume(o.positionWC,o.directionWC,o.upWC)}function W5e(e,t,n=new M.BoundingRectangle){Vn(e.width>=0&&e.height>=0),Vn(t.width>=0&&t.height>=0);const i=Math.max(e.x,t.x),r=Math.min(e.x+e.width,t.x+t.width),o=Math.max(e.y,t.y),s=Math.min(e.y+e.height,t.y+t.height);if(!(i>=r||o>=s))return n.x=i,n.y=o,n.width=r-i,n.height=s-o,n.clone(new M.BoundingRectangle)}const B5e=new Ume({pass:Ome.PICK}),Y5e=new M.Color(0,0,0,0),H5e=new M.Cartesian2,jl=new M.BoundingRectangle;function j5e(e,t,n,i){const r=e.groundPrimitives.show;e.groundPrimitives.show=!1,Vn(n>0&&i>0);const o=e.context,s=e.defaultView;e.view=s;const a=s.viewport;a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight,s.passState.viewport=M.BoundingRectangle.clone(a,s.passState.viewport),e.jobScheduler.disableThisFrame(),e.updateFrameState();const c=Vi.transformWindowToDrawingBuffer(e,t,H5e),l=PF(e),u=n*l,h=i*l,d=e.frameState;d.cullingVolume=U5e(e,c,u,h,a),d.invertClassification=!1,d.passes.pick=!0,d.tilesetPassState=B5e,o.uniformState.update(d),e.updateEnvironment(),jl.x=c.x-u/2,jl.y=e.drawingBufferHeight-c.y-h/2,jl.height=h,jl.width=u;const f=W5e(jl,s.viewport,jl);Vn(f!=null);const p=s.pickFramebuffer.begin(f,s.viewport);e.updateAndExecuteCommands(p,Y5e),e.resolveFramebuffers(p);const m=X5e.apply(s.pickFramebuffer,[jl]);return o.endFrame(),e.groundPrimitives.show=r,m}const K5e=(e,t,n,i,r)=>{const o=j5e(e.scene,t,n,i),s=[];for(const a of o){const[c,l]=Fx(e.clock.currentTime,a)??[],u=l?{...l,layerId:c}:void 0;!u||r&&!r(u)||s.push(u)}return s};function J5e(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function rN(e,t,n){n===void 0&&(n={});for(var i=0,r=e;i<r.length;i++){var o=r[i];if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");for(var s=0;s<o[o.length-1].length;s++)if(o[o.length-1][s]!==o[0][s])throw new Error("First and last Position are not equivalent.")}var a={type:"Polygon",coordinates:e};return J5e(a,t,n)}function Q5e(e){var t=e%360;return t*Math.PI/180}function oN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function q5e(e){return!!e&&e.constructor===Object}var mr=63710088e-1,sN={centimeters:mr*100,centimetres:mr*100,degrees:mr/111325,feet:mr*3.28084,inches:mr*39.37,kilometers:mr/1e3,kilometres:mr/1e3,meters:mr,metres:mr,miles:mr/1609.344,millimeters:mr*1e3,millimetres:mr*1e3,nauticalmiles:mr/1852,radians:1,yards:mr*1.0936};function $5e(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function eLe(e,t,n){if(n===void 0&&(n={}),!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!cN(e[0])||!cN(e[1]))throw new Error("coordinates must contain numbers");var i={type:"Point",coordinates:e};return $5e(i,t,n)}function tLe(e,t){var n=sN[t];return e*n}function nLe(e,t){t===void 0&&(t="kilometers");var n=sN[t];if(!n)throw new Error(t+" units is invalid");return e/n}function aN(e){var t=e%360;return t*Math.PI/180}function iLe(e,t,n){if(t===void 0&&(t="kilometers"),!(e>=0))throw new Error("length must be a positive number");return tLe(nLe(e,t),n)}function cN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function rLe(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function tE(e,t,n,i){i===void 0&&(i={});var r=t<0,o=iLe(Math.abs(t),i.units,"meters");r&&(o=-Math.abs(o));var s=rLe(e),a=oLe(s,o,n);return a[0]+=a[0]-s[0]>180?-360:s[0]-a[0]>180?360:0,eLe(a,i.properties)}function oLe(e,t,n,i){i=i===void 0?mr:Number(i);var r=t/i,o=e[0]*Math.PI/180,s=aN(e[1]),a=aN(n),c=r*Math.cos(a),l=s+c;Math.abs(l)>Math.PI/2&&(l=l>0?Math.PI-l:-Math.PI-l);var u=Math.log(Math.tan(l/2+Math.PI/4)/Math.tan(s/2+Math.PI/4)),h=Math.abs(u)>1e-11?c/u:Math.cos(s),d=r*Math.sin(a)/h,f=o+d;return[(f*180/Math.PI+540)%360-180,l*180/Math.PI]}function sLe(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function aLe(e,t,n){if(n===void 0&&(n={}),!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!lN(e[0])||!lN(e[1]))throw new Error("coordinates must contain numbers");var i={type:"Point",coordinates:e};return sLe(i,t,n)}function lN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function cLe(e){return!!e&&e.constructor===Object}function nE(e,t,n){if(e!==null)for(var i,r,o,s,a,c,l,u=0,h=0,d,f=e.type,p=f==="FeatureCollection",m=f==="Feature",y=p?e.features.length:1,g=0;g<y;g++){l=p?e.features[g].geometry:m?e.geometry:e,d=l?l.type==="GeometryCollection":!1,a=d?l.geometries.length:1;for(var v=0;v<a;v++){var S=0,T=0;if(s=d?l.geometries[v]:l,s!==null){c=s.coordinates;var C=s.type;switch(u=n&&(C==="Polygon"||C==="MultiPolygon")?1:0,C){case null:break;case"Point":if(t(c,h,g,S,T)===!1)return!1;h++,S++;break;case"LineString":case"MultiPoint":for(i=0;i<c.length;i++){if(t(c[i],h,g,S,T)===!1)return!1;h++,C==="MultiPoint"&&S++}C==="LineString"&&S++;break;case"Polygon":case"MultiLineString":for(i=0;i<c.length;i++){for(r=0;r<c[i].length-u;r++){if(t(c[i][r],h,g,S,T)===!1)return!1;h++}C==="MultiLineString"&&S++,C==="Polygon"&&T++}C==="Polygon"&&S++;break;case"MultiPolygon":for(i=0;i<c.length;i++){for(T=0,r=0;r<c[i].length;r++){for(o=0;o<c[i][r].length-u;o++){if(t(c[i][r][o],h,g,S,T)===!1)return!1;h++}T++}S++}break;case"GeometryCollection":for(i=0;i<s.geometries.length;i++)if(nE(s.geometries[i],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function lLe(e,t){t===void 0&&(t={});var n=0,i=0,r=0;return nE(e,function(o){n+=o[0],i+=o[1],r++},!0),aLe([n/r,i/r],t.properties)}function uLe(e){var t=e%(2*Math.PI);return t*180/Math.PI}function iE(e){var t=e%360;return t*Math.PI/180}function Pb(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function hLe(e,t,n){n===void 0&&(n={});var i;n.final?i=uN(Pb(t),Pb(e)):i=uN(Pb(e),Pb(t));var r=i>180?-(360-i):i;return r}function uN(e,t){var n=iE(e[1]),i=iE(t[1]),r=iE(t[0]-e[0]);r>Math.PI&&(r-=2*Math.PI),r<-Math.PI&&(r+=2*Math.PI);var o=Math.log(Math.tan(i/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),s=Math.atan2(r,o);return(uLe(s)+360)%360}var gr=63710088e-1,hN={centimeters:gr*100,centimetres:gr*100,degrees:gr/111325,feet:gr*3.28084,inches:gr*39.37,kilometers:gr/1e3,kilometres:gr/1e3,meters:gr,metres:gr,miles:gr/1609.344,millimeters:gr*1e3,millimetres:gr*1e3,nauticalmiles:gr/1852,radians:1,yards:gr*1.0936};function dLe(e,t){t===void 0&&(t="kilometers");var n=hN[t];if(!n)throw new Error(t+" units is invalid");return e*n}function fLe(e,t){var n=hN[t];return e/n}function pLe(e,t,n){if(n===void 0&&(n="kilometers"),!(e>=0))throw new Error("length must be a positive number");return dLe(fLe(e,t),n)}function dN(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function mLe(e,t,n){n===void 0&&(n={});var i=dN(e),r=dN(t);r[0]+=r[0]-i[0]>180?-360:i[0]-r[0]>180?360:0;var o=gLe(i,r),s=pLe(o,"meters",n.units);return s}function gLe(e,t,n){n=n===void 0?gr:Number(n);var i=n,r=e[1]*Math.PI/180,o=t[1]*Math.PI/180,s=o-r,a=Math.abs(t[0]-e[0])*Math.PI/180;a>Math.PI&&(a-=2*Math.PI);var c=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(r/2+Math.PI/4)),l=Math.abs(c)>1e-11?s/c:Math.cos(r),u=Math.sqrt(s*s+l*l*a*a),h=u*i;return h}function yLe(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return fN(e);case"FeatureCollection":return bLe(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return rE(e);default:throw new Error("unknown GeoJSON type")}}function fN(e){var t={type:"Feature"};return Object.keys(e).forEach(function(n){switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=pN(e.properties),t.geometry=rE(e.geometry),t}function pN(e){var t={};return e&&Object.keys(e).forEach(function(n){var i=e[n];typeof i=="object"?i===null?t[n]=null:Array.isArray(i)?t[n]=i.map(function(r){return r}):t[n]=pN(i):t[n]=i}),t}function bLe(e){var t={type:"FeatureCollection"};return Object.keys(e).forEach(function(n){switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(function(n){return fN(n)}),t}function rE(e){var t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(function(n){return rE(n)}),t):(t.coordinates=mN(e.coordinates),t)}function mN(e){var t=e;return typeof t[0]!="object"?t.slice():t.map(function(n){return mN(n)})}function _Le(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function vLe(e,t,n){if(n=n||{},!cLe(n))throw new Error("options is invalid");var i=n.pivot,r=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");return t===0||(i||(i=lLe(e)),(r===!1||r===void 0)&&(e=yLe(e)),nE(e,function(o){var s=hLe(i,o),a=s+t,c=mLe(i,o),l=_Le(tE(i,c,a));o[0]=l[0],o[1]=l[1]})),e}function oE(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function wLe(e,t,n,i){i=i||{};var r=i.steps||64,o=i.units||"kilometers",s=i.angle||0,a=i.pivot||e,c=i.properties||e.properties||{};if(!e)throw new Error("center is required");if(!t)throw new Error("xSemiAxis is required");if(!n)throw new Error("ySemiAxis is required");if(!q5e(i))throw new Error("options must be an object");if(!oN(r))throw new Error("steps must be a number");if(!oN(s))throw new Error("angle must be a number");var l=oE(e);if(o==="degrees")var u=Q5e(s);else t=tE(e,t,90,{units:o}),n=tE(e,n,0,{units:o}),t=oE(t)[0]-l[0],n=oE(n)[1]-l[1];for(var h=[],d=0;d<r;d+=1){var f=d*-360/r,p=t*n/Math.sqrt(Math.pow(n,2)+Math.pow(t,2)*Math.pow(gN(f),2)),m=t*n/Math.sqrt(Math.pow(t,2)+Math.pow(n,2)/Math.pow(gN(f),2));if(f<-90&&f>=-270&&(p=-p),f<-180&&f>=-360&&(m=-m),o==="degrees"){var y=p*Math.cos(u)+m*Math.sin(u),g=m*Math.cos(u)-p*Math.sin(u);p=y,m=g}h.push([p+l[0],m+l[1]])}return h.push(h[0]),o==="degrees"?rN([h],c):vLe(rN([h],c),s,{pivot:a})}function gN(e){var t=e*Math.PI/180;return Math.tan(t)}const Kl=new Te,Ob=new b,sE=new b;function xLe(e,t){if(e.length===1)try{const n=Te.fromCartesian(e[0],t,Kl);return kR([U.toDegrees(n.longitude),U.toDegrees(n.latitude)]).geometry}catch(n){console.error(n)}}function SLe(e,t){if(e.length!==2)return;const n=b.distance(e[0],e[1]);if(n!==0)try{const i=Te.fromCartesian(e[0],t,Kl);return wLe([U.toDegrees(i.longitude),U.toDegrees(i.latitude)],n,n,{units:"meters"}).geometry}catch(i){console.error(i)}}function ELe(e,t){if(!(e.length!==2&&e.length!==3))try{if(e.length===2)return n_(e.map(h=>{const d=Te.fromCartesian(h,t,Kl);return[U.toDegrees(d.longitude),U.toDegrees(d.latitude)]})).geometry;const[n,i,r]=e,o=b.projectVector(b.subtract(r,n,Ob),b.subtract(i,n,sE),Ob),s=b.subtract(r,b.add(n,o,Ob),sE),a=b.add(n,s,Ob),c=b.add(i,s,sE);return sl([[n,i,c,a,n].map(u=>{const h=Te.fromCartesian(u,t,Kl);return[U.toDegrees(h.longitude),U.toDegrees(h.latitude)]})]).geometry}catch(n){console.error(n)}}function TLe(e,t){if(!(e.length<2))try{return n_(e.map(i=>{const r=Te.fromCartesian(i,t,Kl);return[U.toDegrees(r.longitude),U.toDegrees(r.latitude)]})).geometry}catch(n){console.error(n)}}function CLe(e,t){if(!(e.length<2))try{return e.length===2?n_(e.map(r=>{const o=Te.fromCartesian(r,t,Kl);return[U.toDegrees(o.longitude),U.toDegrees(o.latitude)]})).geometry:sl([[...e,e[0]].map(i=>{const r=Te.fromCartesian(i,t,Kl);return[U.toDegrees(r.longitude),U.toDegrees(r.latitude)]})]).geometry}catch(n){console.error(n)}}function yN({type:e,controlPoints:t}){switch(e){case"marker":return xLe(t);case"polyline":return TLe(t);case"circle":case"extrudedCircle":return SLe(t);case"rectangle":case"extrudedRectangle":return ELe(t);case"polygon":case"extrudedPolygon":return CLe(t);default:return}}function RLe(e,t){const n=R.useRef(void 0),i=R.useRef({click:[],doubleClick:[],mouseDown:[],mouseUp:[],rightClick:[],rightDown:[],rightUp:[],middleClick:[],middleDown:[],middleUp:[],mouseMove:[],mouseEnter:[],mouseLeave:[],wheel:[]}),r=R.useRef([]),o=R.useMemo(()=>({name:"cesium",requestRender:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||s.scene?.requestRender()},getCamera:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return lo(s)},getLocationFromScreen:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return Yv(l.scene,s,a,c)},getCameraFovInfo:({withTerrain:s,calcViewSize:a})=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))try{let l,u,h;return s&&(u=joe(c.scene),u&&(l=v5(u,c.scene))),l||(u=new Ze.Cartesian3,_5(c.scene,u),l=v5(u,c.scene)),a&&u&&c.scene.camera.frustum instanceof Ze.PerspectiveFrustum&&c.scene.camera.frustum.fov!==void 0&&(h=Ze.Cartesian3.distance(c.scene.camera.positionWC,u)*Math.tan(c.scene.camera.frustum.fov/2)),{center:l,viewSize:h}}catch{return}},sampleTerrainHeight:async(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return await Bu(c.scene,s,a)},computeGlobeHeight:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return l.scene.globe.getHeight(Ze.Cartographic.fromDegrees(s,a,c))},getGlobeHeight:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed())return;const a=s.scene,{globeHeight:c}=a;if(!(!a||c==null))return c},toXYZ:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!u||u.isDestroyed())return;const h=Ze.Cartesian3.fromDegrees(s,a,c,l?.useGlobeEllipsoid?u.scene.globe.ellipsoid:void 0);return[h.x,h.y,h.z]},toLngLatHeight:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!u||u.isDestroyed())return;const h=Ze.Cartographic.fromCartesian(Ze.Cartesian3.fromElements(s,a,c),l?.useGlobeEllipsoid?u.scene.globe.ellipsoid:void 0);return[M.Math.toDegrees(h.longitude),M.Math.toDegrees(h.latitude),h.height]},toWindowPosition:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Ze.SceneTransforms.worldToWindowCoordinates(a.scene,Ze.Cartesian3.fromElements(...s));if(c)return[c.x,c.y]},convertScreenToPositionOffset:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Ze.Cartesian3.fromElements(...s),u=new Ze.Cartesian3,h=new Ze.Cartographic,d=new Ze.Cartesian3,f=new Ze.Ellipsoid,p=new Ze.Ray,m=new Ze.Cartesian3,y=c.scene,g=y.globe.ellipsoid;let v;try{v=Ze.Cartographic.fromCartesian(l,g,h)}catch{return}d.x=g.radii.x+v.height,d.y=g.radii.y+v.height,d.z=g.radii.z+v.height;const S=Ze.Ellipsoid.fromCartesian3(d,f),T=new Ze.Cartesian2;try{[T.x,T.y]=o.toWindowPosition(s)??[0,0]}catch{return}T.x+=a[0],T.y+=a[1];const C=y.camera.getPickRay(T,p);if(C==null)return;const O=Ze.IntersectionTests.rayEllipsoid(C,S);if(O==null)return;const V=Ze.Ray.getPoint(C,O.start,m),A=Ze.Cartesian3.subtract(V,l,u);return[A.x,A.y,A.z]},isPositionVisible:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return!1;const c=new rs(Ze.Ellipsoid.WGS84,Ze.Cartesian3.ZERO);return c.cameraPosition=a.scene.camera.position,c.isPointVisible(Ze.Cartesian3.fromElements(...s))},setView:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed()||s.lat===void 0||s.lng===void 0||s.height===void 0)return!1;const c=a.scene;if(s.lng||s.lat||s.height){const l=Ze.Cartesian3.fromDegrees(s.lng,s.lat,s.height);c.camera.position.x=l.x,c.camera.position.y=l.y,c.camera.position.z=l.z}(s.heading||s.pitch)&&c.camera.setView({orientation:{heading:s.heading,pitch:s.pitch}}),s.fov&&c.camera.frustum instanceof Ze.PerspectiveFrustum&&(c.camera.frustum.fov=s.fov)},getExtrudedHeight:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return gse(l.scene,new Ze.Cartesian3(s[0],s[1],s[2]),new Ze.Cartesian2(a[0],a[1]),c)},getExtrudedPoint:(s,a)=>{if(!s||!a)return;const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=new Ze.Cartesian3(s[0],s[1],s[2]),u=new Ze.Cartesian3,h=c.scene?.globe.ellipsoid.geodeticSurfaceNormal(l,u);if(!h)return;const d=Ze.Cartesian3.add(l,Ze.Cartesian3.multiplyByScalar(h,a,u),u);return[d.x,d.y,d.z]},getSurfaceDistance:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=c.scene,u=new Ze.EllipsoidGeodesic(void 0,void 0,l.globe.ellipsoid);return u.setEndPoints(Ze.Cartographic.fromCartesian(s,l.globe.ellipsoid,new Ze.Cartographic),Ze.Cartographic.fromCartesian(a,l.globe.ellipsoid,new Ze.Cartographic)),u.surfaceDistance},equalsEpsilon2d:(s,a,c=0,l=0)=>Ze.Cartesian2.equalsEpsilon(new Ze.Cartesian2(s[0],s[1]),new Ze.Cartesian2(a[0],a[1]),c,l),equalsEpsilon3d:(s,a,c=0,l=0)=>Ze.Cartesian3.equalsEpsilon(new Ze.Cartesian3(s[0],s[1],s[2]),new Ze.Cartesian3(a[0],a[1],a[2]),c,l),createGeometry:({type:s,controlPoints:a})=>yN({type:s,controlPoints:a.map(c=>new Ze.Cartesian3(...c))}),setCursor:s=>{const a=t.current?.cesiumElement;if(!(!a||a.isDestroyed()))return a.canvas.style.cursor=s??"auto",null},flyTo:(s,a)=>{if(s&&typeof s=="object"){const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;n.current?.(),n.current=Hv(c.scene?.camera,{...lo(c),...s},a)}if(s&&typeof s=="string"){const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=s,u=Us(c,l,l,!0),h=Tt(u);if(u instanceof Ze.Primitive){c.scene.camera.flyToBoundingSphere(Ze.BoundingSphere.fromTransformation(u.modelMatrix));return}if(u instanceof Ze.GroundPrimitive){c.scene.camera.flyToBoundingSphere(h?.originalProperties);return}if(u&&!(u instanceof Ze.Cesium3DTileFeature||u instanceof Ze.Cesium3DTilePointFeature||u instanceof Ze.Model||u instanceof Ze.Primitive||u instanceof Ze.GroundPrimitive))c.flyTo(u,a);else{for(const p of[c.dataSourceDisplay.dataSources,c.dataSources])for(let m=0;m<p.length;m++){const y=p.get(m);if(y.entities.values.find(S=>Tt(S)?.layerId===l)){c.flyTo(y,a);return}}const d=[];for(const p of c.entities.values)Tt(p)?.layerId===l&&d.push(p);if(d.length){c.flyTo(d,a);return}const f=Us(c,l);if(f instanceof Ze.Primitive){c.scene.camera.flyToBoundingSphere(Ze.BoundingSphere.fromTransformation(f.modelMatrix));return}f&&!(f instanceof Ze.Cesium3DTileFeature||f instanceof Ze.Cesium3DTilePointFeature||f instanceof Ze.Model||f instanceof Ze.Primitive||f instanceof Ze.GroundPrimitive)&&c.flyTo(f,a)}}},flyToBBox:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;n.current?.();const l=Ze.BoundingSphere.fromRectangle3D(Ze.Rectangle.fromDegrees(...s)),u=c.scene.camera;c.camera.flyToBoundingSphere(l,{offset:{heading:a?.heading?M.Math.toDegrees(a.heading):c.scene.camera.heading,pitch:a?.pitch?M.Math.toDegrees(a.pitch):u.pitch,range:a?.range??0},duration:a?.duration}),n.current=()=>{u?.cancelFlight()}},rotateOnCenter:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=_5(c,new Ze.Cartesian3);l&&c.camera.rotate(l,s)},overrideScreenSpaceController:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene?.screenSpaceCameraController,l=ese(s);Object.assign(c,l)},lookAt:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed())){if(a?.withoutAnimation)return Joe(c.scene,{...lo(c),...s});n.current?.(),n.current=Koe(c.scene?.camera,{...lo(c),...s},a)}},lookAtLayer:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.entities.getById(s);if(!c)return;const l=c.position?.getValue(a.clock.currentTime);if(!l)return;const u=a.camera.positionWC,h=Ze.Cartesian3.distance(l,u);if(Math.round(h*1e3)/1e3===5e3)return;const d=lo(a),f=new Ze.HeadingPitchRange(d?.heading??0,d?.pitch??-90,5e3);a.zoomTo(c,f)},getViewport:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed())return;const a=s.camera.computeViewRectangle();return a?{north:M.Math.toDegrees(a.north),south:M.Math.toDegrees(a.south),west:M.Math.toDegrees(a.west),east:M.Math.toDegrees(a.east)}:void 0},zoomIn:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||S5({viewer:c,relativeAmount:1/s},a)},zoomOut:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||S5({viewer:c,relativeAmount:s},a)},orbit:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=c.camera,u=.02,h=s+M.Math.PI_OVER_TWO,d=Math.cos(h)*u,f=Math.sin(h)*u,p=Ze.Matrix4.clone(l.transform),m=x5({camera:l,scene:c});if(m||l.positionWC){const y=Ze.Transforms.eastNorthUpToFixedFrame(m||l.positionWC,c.globe.ellipsoid);l.lookAtTransform(y)}a.scene.mode!==Ze.SceneMode.SCENE3D?l.move(new Ze.Cartesian3(d,f,0),Math.max(c.canvas.clientWidth,c.canvas.clientHeight)/100*l.positionCartographic.height*u):m?(l.rotateLeft(d),l.rotateUp(f)):(l.look(Ze.Cartesian3.UNIT_Z,d),l.look(l.right,f)),l.lookAtTransform(p)},rotateRight:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=c.camera,u=Ze.Matrix4.clone(l.transform),h=Ze.Transforms.eastNorthUpToFixedFrame(l.positionWC,c.globe.ellipsoid);a.scene.mode!==Ze.SceneMode.SCENE3D?(l.twistRight(s- -l.heading),l.twistLeft(s- -l.heading)):(l.lookAtTransform(h),l.rotateRight(s- -l.heading),l.lookAtTransform(u))},changeSceneMode:(s,a=2)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()||!c.scene))switch(s){case"2d":c?.scene?.morphTo2D(a);break;case"columbus":c?.scene?.morphToColumbusView(a);break;default:c?.scene?.morphTo3D(a);break}},getClock:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed()||!s.clock)return;const a=s.clock;return Qoe(a)},captureScreen:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return c.scene.requestRender(),c.render(),c.canvas.toDataURL(s,a)},enableScreenSpaceCameraController:(s=!0)=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed()||!a.scene)return;const c=!!s;a.scene.screenSpaceCameraController.enableRotate=c,a.scene.screenSpaceCameraController.enableTranslate=c,a.scene.screenSpaceCameraController.enableZoom=c,a.scene.screenSpaceCameraController.enableTilt=c,a.scene.screenSpaceCameraController.enableLook=c},lookHorizontal:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||rse(a.scene,s)},lookVertical:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||ose(a.scene,s)},moveForward:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||sse(a.scene,s)},moveBackward:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||ase(a.scene,s)},moveUp:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||cse(a.scene,s)},moveDown:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||lse(a.scene,s)},moveLeft:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||use(a.scene,s)},moveRight:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||hse(a.scene,s)},moveOverTerrain:async s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||dse(a,s)},flyToGround:async(s,a,c)=>{const l=t.current?.cesiumElement;!l||l.isDestroyed()||fse(l,n,s,a,c)},onClick:s=>{i.current.click.push(s)},onDoubleClick:s=>{i.current.doubleClick.push(s)},onMouseDown:s=>{i.current.mouseDown.push(s)},onMouseUp:s=>{i.current.mouseUp.push(s)},onRightClick:s=>{i.current.rightClick.push(s)},onRightDown:s=>{i.current.rightDown.push(s)},onRightUp:s=>{i.current.rightUp.push(s)},onMiddleClick:s=>{i.current.middleClick.push(s)},onMiddleDown:s=>{i.current.middleDown.push(s)},onMiddleUp:s=>{i.current.middleUp.push(s)},onMouseMove:s=>{i.current.mouseMove.push(s)},onMouseEnter:s=>{i.current.mouseEnter.push(s)},onMouseLeave:s=>{i.current.mouseLeave.push(s)},onWheel:s=>{i.current.wheel.push(s)},mouseEventCallbacks:i.current,changeSpeed:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.multiplier=s,a.clock.clockStep=M.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.currentTime=M.JulianDate.fromDate(s))},pause:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||(s.clock.shouldAnimate=!1)},play:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||(s.clock.shouldAnimate=!0)},tick:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return M.JulianDate.toDate(s.clock.tick())},changeStart:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.startTime=M.JulianDate.fromDate(s))},changeStop:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.stopTime=M.JulianDate.fromDate(s))},inViewport:s=>{const a=o.getViewport();return!!(a&&s&&typeof s.lng=="number"&&typeof s.lat=="number"&&Ze.Rectangle.contains(new Ze.Rectangle(M.Math.toRadians(a.west),M.Math.toRadians(a.south),M.Math.toRadians(a.east),M.Math.toRadians(a.north)),Ze.Cartographic.fromDegrees(s.lng,s.lat)))},findFeatureById:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Us(c,s,a),u=Tt(l);if(u?.featureId){if(l instanceof Ze.Entity)return{type:"feature",id:u.featureId,properties:Rh(c.clock.currentTime,l),metaData:{description:Ih(c.clock.currentTime,l)}};if(l instanceof Ze.Cesium3DTileFeature||l instanceof Ze.Cesium3DTilePointFeature)return{type:"feature",id:u.featureId,properties:Mp(l)}}},findFeaturesByIds:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return Cy(c,s,a,l=>{const u=Fx(c.clock.currentTime,l)?.[1];return u?{...u,type:"feature"}:void 0})},findComputedFeatureById:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Us(c,s,a),u=Tt(l);if(u?.featureId){if(l instanceof Ze.Entity)return u.computedFeature??{type:"computedFeature",id:u.featureId,geometry:Mb(c.clock.currentTime,l),properties:Rh(c.clock.currentTime,l),metaData:{description:Ih(c.clock.currentTime,l)}};if(l instanceof Ze.Cesium3DTileFeature||l instanceof Ze.Cesium3DTilePointFeature)return u.computedFeature??{type:"computedFeature",id:u.featureId,properties:Mp(l)}}},findComputedFeaturesByIds:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return Cy(c,s,a,l=>Fx(c.clock.currentTime,l)?.[1])},bringToFront:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Us(a,s);c&&"bringToFront"in c&&typeof c.bringToFront=="function"&&c.bringToFront()},sendToBack:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Us(a,s);c&&"sendToBack"in c&&typeof c.sendToBack=="function"&&c.sendToBack()},selectFeatures:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||Cy(c,s,a,(l,u)=>{u&&"onSelectFeature"in u&&typeof u.onSelectFeature=="function"&&u.onSelectFeature(l);const d={...Tt(l)??{},isFeatureSelected:!0};return xo(l,d),l})},unselectFeatures:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||Cy(c,s,a,(l,u)=>{u&&"onUnselectFeature"in u&&typeof u.onUnselectFeature=="function"&&u.onUnselectFeature(l);const h=Tt(l)??{};return h.isFeatureSelected=!1,xo(l,h),l})},pickManyFromViewport:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!(!u||u.isDestroyed()))return K5e(u,new Ze.Cartesian2(s[0],s[1]),a,c,l)},onTick:s=>{r.current.push(s)},removeTickEventListener:s=>{r.current=r.current.filter(a=>a!==s)||[]},tickEventCallback:r,calcRectangleControlPoint:(s,a,c)=>{const l=new Ze.Cartesian3(...s),u=new Ze.Cartesian3(...a),h=new Ze.Cartesian3(...c),d=new Ze.Cartesian3,f=new Ze.Cartesian3,p=Ze.Cartesian3.projectVector(Ze.Cartesian3.subtract(h,l,d),Ze.Cartesian3.subtract(u,l,f),d),m=Ze.Cartesian3.subtract(h,Ze.Cartesian3.add(l,p,d),f),y=Ze.Cartesian3.midpoint(l,u,d),g=Ze.Cartesian3.add(y,m,f),v=[g.x,g.y,g.z];return[s,a,v]},getCredits:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return C5(s)}}),[t]);return R.useImperativeHandle(e,()=>o,[o]),o}const ILe=({cesium:e,requestingRenderMode:t,isLayerDragging:n,shouldRender:i,property:r})=>{const o=R.useCallback(()=>{const a=e.current?.cesiumElement;!t?.current||!a||a.isDestroyed()||(a.scene.requestRender(),t.current===md&&(t.current=b1))},[e,t]),s=R.useRef(void 0);R.useEffect(()=>{s.current=o},[o]),R.useEffect(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()))return a.scene.postUpdate.addEventListener(()=>{s.current?.()})},[e]),R.useEffect(()=>{t&&(t.current=md)},[r,t]),R.useEffect(()=>{const a=e.current?.cesiumElement;!a||a.isDestroyed()||t&&(t.current=n||i?pC:t.current===md?md:b1)},[e,n,i,t])};var MLe=Object.defineProperty,LLe=Object.defineProperties,PLe=Object.getOwnPropertyDescriptors,bN=Object.getOwnPropertySymbols,OLe=Object.prototype.hasOwnProperty,GLe=Object.prototype.propertyIsEnumerable,_N=(e,t,n)=>t in e?MLe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,VLe=(e,t)=>{for(var n in t||(t={}))OLe.call(t,n)&&_N(e,n,t[n]);if(bN)for(var n of bN(t))GLe.call(t,n)&&_N(e,n,t[n]);return e},FLe=(e,t)=>LLe(e,PLe(t));class aE{constructor(t,n){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new M.CallbackProperty(()=>{var i;return(i=this._position)!=null?i:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=i=>{var r;if(this._entity||this.viewer.isDestroyed()||!i?.position)return;const o=this._pick(i.position);if(!o)return;const s=()=>{var a,c,l;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=o.position,this._initialScreenPosition=i.position.clone();const u=(a=o.position)==null?void 0:a.getValue(this.viewer.clock.currentTime);if(u){const f=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(u).height;this._ellipsoid=aE.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,f),this.viewer.scene.mode===M.SceneMode.SCENE2D||this.viewer.scene.mode===M.SceneMode.COLUMBUS_VIEW?this._initialHeight=f:this._initialHeight=void 0}const h=this._resetHeight(this._convertCartesian2ToPosition(i.position)),d=this._context(h,i.position);if(d&&((l=(c=this.options)==null?void 0:c.onDrag)==null?void 0:l.call(c,o,h,d))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=h,this._entity=o,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===M.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),o.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((r=this.options)==null?void 0:r.dragDelay)>"u"){s();return}this._timeout=window.setTimeout(s,this.options.dragDelay)},this._handleDragging=i=>{var r,o;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!i?.endPosition)return;const s=this._resetHeight(this._convertCartesian2ToPosition(i.endPosition)),a=this._context(s,i.endPosition);if(!a)return;const c=(o=(r=this.options)==null?void 0:r.onDragging)==null?void 0:o.call(r,this._entity,s,FLe(VLe({},a),{previousScreenPosition:i.startPosition}));c!==!1&&(typeof c<"u"?this._position=c:s&&(this._position=s))},this._handleDrop=i=>{var r,o;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!i?.position)return;const s=this._entity;s.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const a=this._resetHeight(this._convertCartesian2ToPosition(i.position)),c=this._context(a,i.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,c&&((o=(r=this.options)==null?void 0:r.onDrop)==null?void 0:o.call(r,s,a,c))!==!1&&a&&(s.position=a)},this.viewer=t,this.options=n,n?.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var t,n,i,r,o,s;this._handler=new M.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(n=(t=this.options)==null?void 0:t.dragInputType)!=null?n:M.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(r=(i=this.options)==null?void 0:i.draggingInputType)!=null?r:M.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(s=(o=this.options)==null?void 0:o.dropInputType)!=null?s:M.ScreenSpaceEventType.LEFT_UP)}disable(){var t;this.cancelDragging(),(t=this._handler)==null||t.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(t){var n;return(n=this.viewer.scene.pick(t))==null?void 0:n.id}_context(t,n){if(this._initialScreenPosition)return{position:t,screenPosition:n,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(t){var n;return this.viewer.scene.camera.pickEllipsoid(t,(n=this._ellipsoid)!=null?n:this.viewer.scene.globe.ellipsoid)}_resetHeight(t){if(t&&(this.viewer.scene.mode===M.SceneMode.SCENE2D||this.viewer.scene.mode===M.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const n=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(t);return M.Cartesian3.fromRadians(n.longitude,n.latitude,this._initialHeight)}return t}static enlargeEllipsoid(t,n){return new M.Ellipsoid(t.radii.x+n,t.radii.y+n,t.radii.z+n)}}const ALe=({cesium:e,isLayerDraggable:t,onLayerDrag:n,onLayerDrop:i})=>{const r=R.useCallback((a,c,l)=>{const u=e.current?.cesiumElement;if(!u||u.isDestroyed()||!E5(a)||!ise(a))return!1;const h=TF(e.current?.cesiumElement,c);if(!h)return!1;const d=Tt(a);if(!d)return!1;n?.(d.layerId||"",d.featureId,h)},[e,n]),o=R.useCallback((a,c)=>{const l=e.current?.cesiumElement;if(!l||l.isDestroyed())return!1;const u=Tt(a),h=TF(e.current?.cesiumElement,c);return i?.(u?.layerId||"",u?.featureId||"",h),!1},[e,i]),s=R.useRef(void 0);return R.useEffect(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()))return s.current=new aE(a,{onDrag:r,onDrop:o,dragDelay:1e3,initialDisabled:!t}),()=>{!a||a.isDestroyed()||s.current?.disable()}},[e,t,r,o]),{handleLayerDrag:r,handleLayerDrop:o}},cE=(e,t)=>{if(!e||e.isDestroyed())return;const n=t.position||t.startPosition;return{x:n?.x,y:n?.y,...n?Yv(e.scene,n.x,n.y,!0)??{}:{}}},zLe=({cesium:e,engineAPI:t,featureFlags:n,onLayerSelectWithRectStart:i,onLayerSelectWithRectMove:r,onLayerSelectWithRectEnd:o})=>{const s=R.useRef([0,0]),a=R.useRef(!1),c=R.useRef(!1),l=R.useCallback((f,p)=>{if(a.current||c.current||n!==z0.selection||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const m=cE(e.current.cesiumElement,f)??{};s.current=[m.x??0,m.y??0],c.current=!0,a.current=!1,i?.({...m,pressedKey:p})},[i,e,n]),u=R.useCallback((f,p,m)=>{if(!c.current||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const y=cE(e.current.cesiumElement,f)??{};let[g,v]=s.current,[S,T]=[y.x??0,y.y??0];if(S-g===0&&T-v===0)return y;m||(a.current=!0),g>S&&([S,g]=[g,S]),v>T&&([T,v]=[v,T]);const C={...y,pressedKey:p,x:S,y:T,startX:g,startY:v,width:S-g,height:T-v};return r?.(C),C},[r,e]),h=R.useCallback((f,p)=>{if(!c.current||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const m=u(f,p,!0),{startX:y=0,startY:g=0,x:v=0,y:S=0,width:T=0,height:C=0}=m??{},[O,V]=[y+T/2,g+C/2],A=a.current?t.pickManyFromViewport([O,V],T,C):t.pickManyFromViewport([v,S],1,1);o?.({...m,pressedKey:p,features:A??[],isClick:!a.current}),a.current=!1,c.current=!1},[o,e,t,u]);return R.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:l,keys:["shift"]},move:{handler:u,keys:["shift"]},end:{handler:h,keys:["shift"]}}).map(([p,m])=>[p,{handler:m.handler,...Object.fromEntries(m.keys.map(y=>[y,g=>m.handler(g,y)]))}])),[h,u,l])},NLe=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
6088
+ Original error:`,G)}}function V(G,k,N){return t(this,void 0,void 0,function*(){let P;try{P=k(...N)}catch(x){return S(G,x)}const w=p(P)?"observable":"promise";if(C(G,w),p(P)){const x=P.subscribe(I=>T(G,!1,r.serialize(I)),I=>{S(G,r.serialize(I)),h.delete(G)},()=>{T(G,!0),h.delete(G)});h.set(G,x)}else try{const x=yield P;T(G,!0,r.serialize(x))}catch(x){S(G,r.serialize(x))}})}function A(G){if(!a.default.isWorkerRuntime())throw Error("expose() called in the master thread.");if(u)throw Error("expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.");if(u=!0,typeof G=="function")a.default.subscribeToMasterMessages(k=>{f(k)&&!k.method&&V(k.uid,G,k.args.map(r.deserialize))}),g();else if(typeof G=="object"&&G){a.default.subscribeToMasterMessages(N=>{f(N)&&N.method&&V(N.uid,G[N.method],N.args.map(r.deserialize))});const k=Object.keys(G).filter(N=>typeof G[N]=="function");v(k)}else throw Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${G}`);a.default.subscribeToMasterMessages(k=>{if(d(k)){const N=k.uid,P=h.get(N);P&&(P.unsubscribe(),h.delete(N))}})}e.expose=A,typeof self<"u"&&typeof self.addEventListener=="function"&&a.default.isWorkerRuntime()&&(self.addEventListener("error",G=>{setTimeout(()=>O(G.error||G),250)}),self.addEventListener("unhandledrejection",G=>{const k=G.reason;k&&typeof k.message=="string"&&setTimeout(()=>O(k),250)})),typeof process<"u"&&typeof process.on=="function"&&a.default.isWorkerRuntime()&&(process.on("uncaughtException",G=>{setTimeout(()=>O(G),250)}),process.on("unhandledRejection",G=>{G&&typeof G.message=="string"&&setTimeout(()=>O(G),250)}))})(Dz),(function(e){var t=Ei&&Ei.__createBinding||(Object.create?function(a,c,l,u){u===void 0&&(u=l),Object.defineProperty(a,u,{enumerable:!0,get:function(){return c[l]}})}:function(a,c,l,u){u===void 0&&(u=l),a[u]=c[l]}),n=Ei&&Ei.__exportStar||function(a,c){for(var l in a)l!=="default"&&!Object.prototype.hasOwnProperty.call(c,l)&&t(c,a,l)};Object.defineProperty(e,"__esModule",{value:!0}),e.Transfer=e.DefaultSerializer=e.expose=e.registerSerializer=void 0;var i=Oo;Object.defineProperty(e,"registerSerializer",{enumerable:!0,get:function(){return i.registerSerializer}}),n(bz,e);var r=Dz;Object.defineProperty(e,"expose",{enumerable:!0,get:function(){return r.expose}});var o=Bl;Object.defineProperty(e,"DefaultSerializer",{enumerable:!0,get:function(){return o.DefaultSerializer}});var s=Za;Object.defineProperty(e,"Transfer",{enumerable:!0,get:function(){return s.Transfer}})})(mz);const Wc=ACe(mz);Wc.registerSerializer;const XMe=Wc.spawn;Wc.BlobWorker,Wc.DefaultSerializer;const ZMe=Wc.Pool;Wc.Thread;const DMe=Wc.Transfer;Wc.Worker;const Uz="dmFyIFJsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgYmw9KFcsSyxydCk9PksgaW4gVz9SbChXLEsse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJ0fSk6V1tLXT1ydDt2YXIgTD0oVyxLLHJ0KT0+KGJsKFcsdHlwZW9mIEshPSJzeW1ib2wiP0srIiI6SyxydCkscnQpLGFyPShXLEsscnQpPT57aWYoIUsuaGFzKFcpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrcnQpfTt2YXIgYz0oVyxLLHJ0KT0+KGFyKFcsSywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxydD9ydC5jYWxsKFcpOksuZ2V0KFcpKSxCPShXLEsscnQpPT57aWYoSy5oYXMoVykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7SyBpbnN0YW5jZW9mIFdlYWtTZXQ/Sy5hZGQoVyk6Sy5zZXQoVyxydCl9LFA9KFcsSyxydCxfZSk9PihhcihXLEssIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxfZT9fZS5jYWxsKFcscnQpOksuc2V0KFcscnQpLHJ0KSx4bj0oVyxLLHJ0LF9lKT0+KHtzZXQgXyhJdCl7UChXLEssSXQscnQpfSxnZXQgXygpe3JldHVybiBjKFcsSyxfZSl9fSksQz0oVyxLLHJ0KT0+KGFyKFcsSywiYWNjZXNzIHByaXZhdGUgbWV0aG9kIikscnQpOyhmdW5jdGlvbigpe3ZhciBraSxDZSxDdCxPdCxOdCxNdCxNZSxodCxGdCxhdCxldCx2LF90LFR0LEV0LGZ0LEx0LGx0LFB0LHZ0LFJ0LER0LGVlLHB0LGtlLGhyLGZlLHF0LFZlLGJ0LHBuLFZpLGxlLEZlLFhlLCR0LG5lLGt0LHJlLFdlLGNyLFRsLExlLE9uLFBlLFRuLFksbnQsemUsdXIsZGUscWU7InVzZSBzdHJpY3QiO3ZhciBXPXR5cGVvZiBnbG9iYWxUaGlzPCJ1Ij9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6e307ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiZGVmYXVsdCIpP3QuZGVmYXVsdDp0fXZhciBydD17fSxfZT10PT50P3R5cGVvZiBTeW1ib2wub2JzZXJ2YWJsZT09InN5bWJvbCImJnR5cGVvZiB0W1N5bWJvbC5vYnNlcnZhYmxlXT09ImZ1bmN0aW9uIj90PT09dFtTeW1ib2wub2JzZXJ2YWJsZV0oKTp0eXBlb2YgdFsiQEBvYnNlcnZhYmxlIl09PSJmdW5jdGlvbiI/dD09PXRbIkBAb2JzZXJ2YWJsZSJdKCk6ITE6ITEsSXQ9e30scGU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHBlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxwZS5EZWZhdWx0U2VyaWFsaXplcj1wZS5leHRlbmRTZXJpYWxpemVyPXZvaWQgMDtmdW5jdGlvbiBYaSh0LGUpe2NvbnN0IG49dC5kZXNlcmlhbGl6ZS5iaW5kKHQpLHI9dC5zZXJpYWxpemUuYmluZCh0KTtyZXR1cm57ZGVzZXJpYWxpemUoaSl7cmV0dXJuIGUuZGVzZXJpYWxpemUoaSxuKX0sc2VyaWFsaXplKGkpe3JldHVybiBlLnNlcmlhbGl6ZShpLHIpfX19cGUuZXh0ZW5kU2VyaWFsaXplcj1YaTtjb25zdCBmcj17ZGVzZXJpYWxpemUodCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oRXJyb3IodC5tZXNzYWdlKSx7bmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFja30pfSxzZXJpYWxpemUodCl7cmV0dXJue19fZXJyb3JfbWFya2VyOiIkJGVycm9yIixtZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrfX19LFdpPXQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmIl9fZXJyb3JfbWFya2VyImluIHQmJnQuX19lcnJvcl9tYXJrZXI9PT0iJCRlcnJvciI7cGUuRGVmYXVsdFNlcmlhbGl6ZXI9e2Rlc2VyaWFsaXplKHQpe3JldHVybiBXaSh0KT9mci5kZXNlcmlhbGl6ZSh0KTp0fSxzZXJpYWxpemUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcj9mci5zZXJpYWxpemUodCk6dH19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksSXQuc2VyaWFsaXplPUl0LmRlc2VyaWFsaXplPUl0LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3QgbHI9cGU7bGV0IEtlPWxyLkRlZmF1bHRTZXJpYWxpemVyO2Z1bmN0aW9uIHppKHQpe0tlPWxyLmV4dGVuZFNlcmlhbGl6ZXIoS2UsdCl9SXQucmVnaXN0ZXJTZXJpYWxpemVyPXppO2Z1bmN0aW9uIEhpKHQpe3JldHVybiBLZS5kZXNlcmlhbGl6ZSh0KX1JdC5kZXNlcmlhbGl6ZT1IaTtmdW5jdGlvbiBxaSh0KXtyZXR1cm4gS2Uuc2VyaWFsaXplKHQpfUl0LnNlcmlhbGl6ZT1xaTt2YXIgaWU9e30sZ3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxndC4kd29ya2VyPWd0LiR0cmFuc2ZlcmFibGU9Z3QuJHRlcm1pbmF0ZT1ndC4kZXZlbnRzPWd0LiRlcnJvcnM9dm9pZCAwLGd0LiRlcnJvcnM9U3ltYm9sKCJ0aHJlYWQuZXJyb3JzIiksZ3QuJGV2ZW50cz1TeW1ib2woInRocmVhZC5ldmVudHMiKSxndC4kdGVybWluYXRlPVN5bWJvbCgidGhyZWFkLnRlcm1pbmF0ZSIpLGd0LiR0cmFuc2ZlcmFibGU9U3ltYm9sKCJ0aHJlYWQudHJhbnNmZXJhYmxlIiksZ3QuJHdvcmtlcj1TeW1ib2woInRocmVhZC53b3JrZXIiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaWUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGllLlRyYW5zZmVyPWllLmlzVHJhbnNmZXJEZXNjcmlwdG9yPXZvaWQgMDtjb25zdCBkcj1ndDtmdW5jdGlvbiBLaSh0KXtyZXR1cm4hKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpfWZ1bmN0aW9uIFlpKHQpe3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnRbZHIuJHRyYW5zZmVyYWJsZV19aWUuaXNUcmFuc2ZlckRlc2NyaXB0b3I9WWk7ZnVuY3Rpb24gWmkodCxlKXtpZighZSl7aWYoIUtpKHQpKXRocm93IEVycm9yKCk7ZT1bdF19cmV0dXJue1tkci4kdHJhbnNmZXJhYmxlXTohMCxzZW5kOnQsdHJhbnNmZXJhYmxlczplfX1pZS5UcmFuc2Zlcj1aaTt2YXIgRXI9e307KGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lldvcmtlck1lc3NhZ2VUeXBlPXQuTWFzdGVyTWVzc2FnZVR5cGU9dm9pZCAwLGZ1bmN0aW9uKGUpe2UuY2FuY2VsPSJjYW5jZWwiLGUucnVuPSJydW4ifSh0Lk1hc3Rlck1lc3NhZ2VUeXBlfHwodC5NYXN0ZXJNZXNzYWdlVHlwZT17fSkpLGZ1bmN0aW9uKGUpe2UuZXJyb3I9ImVycm9yIixlLmluaXQ9ImluaXQiLGUucmVzdWx0PSJyZXN1bHQiLGUucnVubmluZz0icnVubmluZyIsZS51bmNhdWdodEVycm9yPSJ1bmNhdWdodEVycm9yIn0odC5Xb3JrZXJNZXNzYWdlVHlwZXx8KHQuV29ya2VyTWVzc2FnZVR5cGU9e30pKX0pKEVyKTt2YXIgUm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBRaT1mdW5jdGlvbigpe2NvbnN0IGU9dHlwZW9mIHNlbGY8InUiJiZ0eXBlb2YgV2luZG93PCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdpbmRvdztyZXR1cm4hISh0eXBlb2Ygc2VsZjwidSImJnNlbGYucG9zdE1lc3NhZ2UmJiFlKX0sSmk9ZnVuY3Rpb24oZSxuKXtzZWxmLnBvc3RNZXNzYWdlKGUsbil9LHRvPWZ1bmN0aW9uKGUpe2NvbnN0IG49aT0+e2UoaS5kYXRhKX0scj0oKT0+e3NlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O3JldHVybiBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pLHJ9O1JuLmRlZmF1bHQ9e2lzV29ya2VyUnVudGltZTpRaSxwb3N0TWVzc2FnZVRvTWFzdGVyOkppLHN1YnNjcmliZVRvTWFzdGVyTWVzc2FnZXM6dG99LGZ1bmN0aW9uKHQpe3ZhciBlPVcmJlcuX19hd2FpdGVyfHxmdW5jdGlvbihULFUsWCxvdCl7ZnVuY3Rpb24gQnQoY3Qpe3JldHVybiBjdCBpbnN0YW5jZW9mIFg/Y3Q6bmV3IFgoZnVuY3Rpb24oVXQpe1V0KGN0KX0pfXJldHVybiBuZXcoWHx8KFg9UHJvbWlzZSkpKGZ1bmN0aW9uKGN0LFV0KXtmdW5jdGlvbiB5bihFZSl7dHJ5e0hlKG90Lm5leHQoRWUpKX1jYXRjaChzcil7VXQoc3IpfX1mdW5jdGlvbiBBbihFZSl7dHJ5e0hlKG90LnRocm93KEVlKSl9Y2F0Y2goc3Ipe1V0KHNyKX19ZnVuY3Rpb24gSGUoRWUpe0VlLmRvbmU/Y3QoRWUudmFsdWUpOkJ0KEVlLnZhbHVlKS50aGVuKHluLEFuKX1IZSgob3Q9b3QuYXBwbHkoVCxVfHxbXSkpLm5leHQoKSl9KX0sbj1XJiZXLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oVCl7cmV0dXJuIFQmJlQuX19lc01vZHVsZT9UOntkZWZhdWx0OlR9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5leHBvc2U9dC5pc1dvcmtlclJ1bnRpbWU9dC5UcmFuc2Zlcj10LnJlZ2lzdGVyU2VyaWFsaXplcj12b2lkIDA7Y29uc3Qgcj1uKF9lKSxpPUl0LG89aWUscz1FcixoPW4oUm4pO3ZhciBhPUl0O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZWdpc3RlclNlcmlhbGl6ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhLnJlZ2lzdGVyU2VyaWFsaXplcn19KTt2YXIgZj1pZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiVHJhbnNmZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmLlRyYW5zZmVyfX0pLHQuaXNXb3JrZXJSdW50aW1lPWguZGVmYXVsdC5pc1dvcmtlclJ1bnRpbWU7bGV0IGQ9ITE7Y29uc3QgXz1uZXcgTWFwLFM9VD0+VCYmVC50eXBlPT09cy5NYXN0ZXJNZXNzYWdlVHlwZS5jYW5jZWwsTz1UPT5UJiZULnR5cGU9PT1zLk1hc3Rlck1lc3NhZ2VUeXBlLnJ1bix3PVQ9PnIuZGVmYXVsdChUKXx8YihUKTtmdW5jdGlvbiBiKFQpe3JldHVybiBUJiZ0eXBlb2YgVD09Im9iamVjdCImJnR5cGVvZiBULnN1YnNjcmliZT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBNKFQpe3JldHVybiBvLmlzVHJhbnNmZXJEZXNjcmlwdG9yKFQpP3twYXlsb2FkOlQuc2VuZCx0cmFuc2ZlcmFibGVzOlQudHJhbnNmZXJhYmxlc306e3BheWxvYWQ6VCx0cmFuc2ZlcmFibGVzOnZvaWQgMH19ZnVuY3Rpb24gbSgpe2NvbnN0IFQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5pbml0LGV4cG9zZWQ6e3R5cGU6ImZ1bmN0aW9uIn19O2guZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFQpfWZ1bmN0aW9uIEcoVCl7Y29uc3QgVT17dHlwZTpzLldvcmtlck1lc3NhZ2VUeXBlLmluaXQsZXhwb3NlZDp7dHlwZToibW9kdWxlIixtZXRob2RzOlR9fTtoLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihVKX1mdW5jdGlvbiBRKFQsVSl7Y29uc3R7cGF5bG9hZDpYLHRyYW5zZmVyYWJsZXM6b3R9PU0oVSksQnQ9e3R5cGU6cy5Xb3JrZXJNZXNzYWdlVHlwZS5lcnJvcix1aWQ6VCxlcnJvcjppLnNlcmlhbGl6ZShYKX07aC5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoQnQsb3QpfWZ1bmN0aW9uIEgoVCxVLFgpe2NvbnN0e3BheWxvYWQ6b3QsdHJhbnNmZXJhYmxlczpCdH09TShYKSxjdD17dHlwZTpzLldvcmtlck1lc3NhZ2VUeXBlLnJlc3VsdCx1aWQ6VCxjb21wbGV0ZTpVPyEwOnZvaWQgMCxwYXlsb2FkOm90fTtoLmRlZmF1bHQucG9zdE1lc3NhZ2VUb01hc3RlcihjdCxCdCl9ZnVuY3Rpb24gaXQoVCxVKXtjb25zdCBYPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUucnVubmluZyx1aWQ6VCxyZXN1bHRUeXBlOlV9O2guZGVmYXVsdC5wb3N0TWVzc2FnZVRvTWFzdGVyKFgpfWZ1bmN0aW9uIHl0KFQpe3RyeXtjb25zdCBVPXt0eXBlOnMuV29ya2VyTWVzc2FnZVR5cGUudW5jYXVnaHRFcnJvcixlcnJvcjppLnNlcmlhbGl6ZShUKX07aC5kZWZhdWx0LnBvc3RNZXNzYWdlVG9NYXN0ZXIoVSl9Y2F0Y2goVSl7Y29uc29sZS5lcnJvcihgTm90IHJlcG9ydGluZyB1bmNhdWdodCBlcnJvciBiYWNrIHRvIG1hc3RlciB0aHJlYWQgYXMgaXQgb2NjdXJlZCB3aGlsZSByZXBvcnRpbmcgYW4gdW5jYXVnaHQgZXJyb3IgYWxyZWFkeS4KTGF0ZXN0IGVycm9yOmAsVSxgCk9yaWdpbmFsIGVycm9yOmAsVCl9fWZ1bmN0aW9uIEF0KFQsVSxYKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IG90O3RyeXtvdD1VKC4uLlgpfWNhdGNoKGN0KXtyZXR1cm4gUShULGN0KX1jb25zdCBCdD13KG90KT8ib2JzZXJ2YWJsZSI6InByb21pc2UiO2lmKGl0KFQsQnQpLHcob3QpKXtjb25zdCBjdD1vdC5zdWJzY3JpYmUoVXQ9PkgoVCwhMSxpLnNlcmlhbGl6ZShVdCkpLFV0PT57UShULGkuc2VyaWFsaXplKFV0KSksXy5kZWxldGUoVCl9LCgpPT57SChULCEwKSxfLmRlbGV0ZShUKX0pO18uc2V0KFQsY3QpfWVsc2UgdHJ5e2NvbnN0IGN0PXlpZWxkIG90O0goVCwhMCxpLnNlcmlhbGl6ZShjdCkpfWNhdGNoKGN0KXtRKFQsaS5zZXJpYWxpemUoY3QpKX19KX1mdW5jdGlvbiB2ZShUKXtpZighaC5kZWZhdWx0LmlzV29ya2VyUnVudGltZSgpKXRocm93IEVycm9yKCJleHBvc2UoKSBjYWxsZWQgaW4gdGhlIG1hc3RlciB0aHJlYWQuIik7aWYoZCl0aHJvdyBFcnJvcigiZXhwb3NlKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiBUaGlzIGlzIG5vdCBwb3NzaWJsZS4gUGFzcyBhbiBvYmplY3QgdG8gZXhwb3NlKCkgaWYgeW91IHdhbnQgdG8gZXhwb3NlIG11bHRpcGxlIGZ1bmN0aW9ucy4iKTtpZihkPSEwLHR5cGVvZiBUPT0iZnVuY3Rpb24iKWguZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFU9PntPKFUpJiYhVS5tZXRob2QmJkF0KFUudWlkLFQsVS5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KSxtKCk7ZWxzZSBpZih0eXBlb2YgVD09Im9iamVjdCImJlQpe2guZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFg9PntPKFgpJiZYLm1ldGhvZCYmQXQoWC51aWQsVFtYLm1ldGhvZF0sWC5hcmdzLm1hcChpLmRlc2VyaWFsaXplKSl9KTtjb25zdCBVPU9iamVjdC5rZXlzKFQpLmZpbHRlcihYPT50eXBlb2YgVFtYXT09ImZ1bmN0aW9uIik7RyhVKX1lbHNlIHRocm93IEVycm9yKGBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBleHBvc2UoKS4gRXhwZWN0ZWQgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QsIGdvdDogJHtUfWApO2guZGVmYXVsdC5zdWJzY3JpYmVUb01hc3Rlck1lc3NhZ2VzKFU9PntpZihTKFUpKXtjb25zdCBYPVUudWlkLG90PV8uZ2V0KFgpO290JiYob3QudW5zdWJzY3JpYmUoKSxfLmRlbGV0ZShYKSl9fSl9dC5leHBvc2U9dmUsdHlwZW9mIHNlbGY8InUiJiZ0eXBlb2Ygc2VsZi5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZoLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixUPT57c2V0VGltZW91dCgoKT0+eXQoVC5lcnJvcnx8VCksMjUwKX0pLHNlbGYuYWRkRXZlbnRMaXN0ZW5lcigidW5oYW5kbGVkcmVqZWN0aW9uIixUPT57Y29uc3QgVT1ULnJlYXNvbjtVJiZ0eXBlb2YgVS5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+eXQoVSksMjUwKX0pKSx0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZiBwcm9jZXNzLm9uPT0iZnVuY3Rpb24iJiZoLmRlZmF1bHQuaXNXb3JrZXJSdW50aW1lKCkmJihwcm9jZXNzLm9uKCJ1bmNhdWdodEV4Y2VwdGlvbiIsVD0+e3NldFRpbWVvdXQoKCk9Pnl0KFQpLDI1MCl9KSxwcm9jZXNzLm9uKCJ1bmhhbmRsZWRSZWplY3Rpb24iLFQ9PntUJiZ0eXBlb2YgVC5tZXNzYWdlPT0ic3RyaW5nIiYmc2V0VGltZW91dCgoKT0+eXQoVCksMjUwKX0pKX0ocnQpO3ZhciBibj1LKHJ0KTtjb25zdCBlbz1ibi5leHBvc2U7Ym4ucmVnaXN0ZXJTZXJpYWxpemVyLGJuLlRyYW5zZmVyO2Z1bmN0aW9uIEkodCxlKXtyZXR1cm4gdD8/ZX1JLkVNUFRZX09CSkVDVD1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBwKHQpe3JldHVybiB0IT1udWxsfWZ1bmN0aW9uIGcodCl7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPXQ7bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaChuKXtlPW4uc3RhY2t9dGhpcy5zdGFjaz1lfXAoT2JqZWN0LmNyZWF0ZSkmJihnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZyksZy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgdD1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBwKHRoaXMuc3RhY2spJiYodCs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSx0fSxnLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IGcoIlRoaXMgZnVuY3Rpb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiIpfTtjb25zdCBzdD17fTtzdC50eXBlT2Y9e307ZnVuY3Rpb24gbm8odCl7cmV0dXJuYCR7dH0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiB5ZSh0LGUsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7ZX0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7dH1gfXN0LmRlZmluZWQ9ZnVuY3Rpb24odCxlKXtpZighcChlKSl0aHJvdyBuZXcgZyhubyh0KSl9LHN0LnR5cGVPZi5mdW5jPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsImZ1bmN0aW9uIix0KSl9LHN0LnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsInN0cmluZyIsdCkpfSxzdC50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyBnKHllKHR5cGVvZiBlLCJudW1iZXIiLHQpKX0sc3QudHlwZU9mLm51bWJlci5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU+PW4pdGhyb3cgbmV3IGcoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKHN0LnR5cGVPZi5udW1iZXIodCxlKSxlPm4pdGhyb3cgbmV3IGcoYEV4cGVjdGVkICR7dH0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfSxzdC50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZihzdC50eXBlT2YubnVtYmVyKHQsZSksZTw9bil0aHJvdyBuZXcgZyhgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscz1mdW5jdGlvbih0LGUsbil7aWYoc3QudHlwZU9mLm51bWJlcih0LGUpLGU8bil0aHJvdyBuZXcgZyhgRXhwZWN0ZWQgJHt0fSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9LHN0LnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsIm9iamVjdCIsdCkpfSxzdC50eXBlT2YuYm9vbD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IGcoeWUodHlwZW9mIGUsImJvb2xlYW4iLHQpKX0sc3QudHlwZU9mLmJpZ2ludD1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iYmlnaW50Iil0aHJvdyBuZXcgZyh5ZSh0eXBlb2YgZSwiYmlnaW50Iix0KSl9LHN0LnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHN0LnR5cGVPZi5udW1iZXIodCxuKSxzdC50eXBlT2YubnVtYmVyKGUsciksbiE9PXIpdGhyb3cgbmV3IGcoYCR7dH0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHtufSBhbmQgJHtyfWApfTt2YXIgdT1zdCxWdD1mdW5jdGlvbih0KXt0PT1udWxsJiYodD1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHQuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheSh0LHQubGVuZ3RoKTp0aGlzLmluaXRfc2VlZCh0KX07VnQucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbih0KXtmb3IodGhpcy5tdFswXT10Pj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgdD10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKCh0JjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsodCY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sVnQucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEscj0wLGk9dGhpcy5OPmU/dGhpcy5OOmU7aTtpLS0pe3ZhciBvPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKG8mNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhvJjY1NTM1KSoxNjY0NTI1KSt0W3JdK3IsdGhpcy5tdFtuXT4+Pj0wLG4rKyxyKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLHI+PWUmJihyPTApfWZvcihpPXRoaXMuTi0xO2k7aS0tKXt2YXIgbz10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChvJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsobyY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9LFZ0LnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIHQsZT1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV50Pj4+MV5lW3QmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyl0PXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV50Pj4+MV5lW3QmMV07dD10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1edD4+PjFeZVt0JjFdLHRoaXMubXRpPTB9cmV0dXJuIHQ9dGhpcy5tdFt0aGlzLm10aSsrXSx0Xj10Pj4+MTEsdF49dDw8NyYyNjM2OTI4NjQwLHRePXQ8PDE1JjQwMjI3MzA3NTIsdF49dD4+PjE4LHQ+Pj4wfSxWdC5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX0sVnQucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfSxWdC5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfSxWdC5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfSxWdC5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmRvbV9pbnQoKT4+PjUsZT10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKHQqNjcxMDg4NjQrZSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciBfcj1WdDtjb25zdCBBPXt9O0EuRVBTSUxPTjE9LjEsQS5FUFNJTE9OMj0uMDEsQS5FUFNJTE9OMz0uMDAxLEEuRVBTSUxPTjQ9MWUtNCxBLkVQU0lMT041PTFlLTUsQS5FUFNJTE9ONj0xZS02LEEuRVBTSUxPTjc9MWUtNyxBLkVQU0lMT044PTFlLTgsQS5FUFNJTE9OOT0xZS05LEEuRVBTSUxPTjEwPTFlLTEwLEEuRVBTSUxPTjExPTFlLTExLEEuRVBTSUxPTjEyPTFlLTEyLEEuRVBTSUxPTjEzPTFlLTEzLEEuRVBTSUxPTjE0PTFlLTE0LEEuRVBTSUxPTjE1PTFlLTE1LEEuRVBTSUxPTjE2PTFlLTE2LEEuRVBTSUxPTjE3PTFlLTE3LEEuRVBTSUxPTjE4PTFlLTE4LEEuRVBTSUxPTjE5PTFlLTE5LEEuRVBTSUxPTjIwPTFlLTIwLEEuRVBTSUxPTjIxPTFlLTIxLEEuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTUsQS5TT0xBUl9SQURJVVM9Njk1NWU1LEEuTFVOQVJfUkFESVVTPTE3Mzc0MDAsQS5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0LEEuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNCxBLnNpZ249SShNYXRoLnNpZ24sZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PTB8fGUhPT1lP2U6ZT4wPzE6LTF9KSxBLnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX0sQS50b1NOb3JtPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9SShlLDI1NSksTWF0aC5yb3VuZCgoQS5jbGFtcCh0LC0xLDEpKi41Ky41KSplKX0sQS5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1JKGUsMjU1KSxBLmNsYW1wKHQsMCxlKS9lKjItMX0sQS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPU1hdGgubWF4KG4tZSwwKSxuPT09MD8wOkEuY2xhbXAoKHQtZSkvbiwwLDEpfSxBLnNpbmg9SShNYXRoLnNpbmgsZnVuY3Rpb24oZSl7cmV0dXJuKE1hdGguZXhwKGUpLU1hdGguZXhwKC1lKSkvMn0pLEEuY29zaD1JKE1hdGguY29zaCxmdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfSksQS5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX0sQS5QST1NYXRoLlBJLEEuT05FX09WRVJfUEk9MS9NYXRoLlBJLEEuUElfT1ZFUl9UV089TWF0aC5QSS8yLEEuUElfT1ZFUl9USFJFRT1NYXRoLlBJLzMsQS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80LEEuUElfT1ZFUl9TSVg9TWF0aC5QSS82LEEuVEhSRUVfUElfT1ZFUl9UV089MypNYXRoLlBJLzIsQS5UV09fUEk9MipNYXRoLlBJLEEuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSksQS5SQURJQU5TX1BFUl9ERUdSRUU9TWF0aC5QSS8xODAsQS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEksQS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9QS5SQURJQU5TX1BFUl9ERUdSRUUvMzYwMCxBLnRvUmFkaWFucz1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiZGVncmVlcyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdCpBLlJBRElBTlNfUEVSX0RFR1JFRX0sQS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInJhZGlhbnMgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQqQS5ERUdSRUVTX1BFUl9SQURJQU59LEEuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtjb25zdCBlPUEuVFdPX1BJLG49dC1NYXRoLmZsb29yKHQvZSkqZTtyZXR1cm4gbjwtTWF0aC5QST9uK2U6bj49TWF0aC5QST9uLWU6bn0sQS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIEEuY2xhbXAodCwtMSpBLlBJX09WRVJfVFdPLEEuUElfT1ZFUl9UV08pfSxBLm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdD49LUEuUEkmJnQ8PUEuUEk/dDpBLnplcm9Ub1R3b1BpKHQrQS5QSSktQS5QSX0sQS56ZXJvVG9Ud29QaT1mdW5jdGlvbih0KXtpZighcCh0KSl0aHJvdyBuZXcgZygiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYodD49MCYmdDw9QS5UV09fUEkpcmV0dXJuIHQ7Y29uc3QgZT1BLm1vZCh0LEEuVFdPX1BJKTtyZXR1cm4gTWF0aC5hYnMoZSk8QS5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPkEuRVBTSUxPTjE0P0EuVFdPX1BJOmV9LEEubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoIm0gaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IGcoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIEEuc2lnbih0KT09PUEuc2lnbihlKSYmTWF0aC5hYnModCk8TWF0aC5hYnMoZSk/dDoodCVlK2UpJWV9LEEuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixyKXtpZighcCh0KSl0aHJvdyBuZXcgZygibGVmdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygicmlnaHQgaXMgcmVxdWlyZWQuIik7bj1JKG4sMCkscj1JKHIsbik7Y29uc3QgaT1NYXRoLmFicyh0LWUpO3JldHVybiBpPD1yfHxpPD1uKk1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0sQS5sZXNzVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIXAodCkpdGhyb3cgbmV3IGcoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFwKGUpKXRocm93IG5ldyBnKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIXAobikpdGhyb3cgbmV3IGcoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPC1ufSxBLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFwKHQpKXRocm93IG5ldyBnKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyBnKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufSxBLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgZygiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgZygiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+bn0sQS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZighcCh0KSl0aHJvdyBuZXcgZygiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighcChuKSl0aHJvdyBuZXcgZygiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU+LW59O2NvbnN0IFllPVsxXTtBLmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgZygiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7Y29uc3QgZT1ZZS5sZW5ndGg7aWYodD49ZSl7bGV0IG49WWVbZS0xXTtmb3IobGV0IHI9ZTtyPD10O3IrKyl7Y29uc3QgaT1uKnI7WWUucHVzaChpKSxuPWl9fXJldHVybiBZZVt0XX0sQS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPUkobiwwKSwhcCh0KSl0aHJvdyBuZXcgZygibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyBnKCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9LEEuaXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IGcoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQhPT0wJiYodCZ0LTEpPT09MH0sQS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD4yMTQ3NDgzNjQ4KXRocm93IG5ldyBnKCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDJeMzEgaXMgcmVxdWlyZWQuIik7cmV0dXJuLS10LHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsKyt0LHR9LEEucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IGcoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH0sQS5jbGFtcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm51bWJlcigidmFsdWUiLHQpLHUudHlwZU9mLm51bWJlcigibWluIixlKSx1LnR5cGVPZi5udW1iZXIoIm1heCIsbiksdDxlP2U6dD5uP246dH07bGV0IHByPW5ldyBfcjtBLnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInNlZWQgaXMgcmVxdWlyZWQuIik7cHI9bmV3IF9yKHQpfSxBLm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gcHIucmFuZG9tKCl9LEEucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiBBLm5leHRSYW5kb21OdW1iZXIoKSooZS10KSt0fSxBLmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKEEuY2xhbXAodCwtMSwxKSl9LEEuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24odCl7aWYoIXAodCkpdGhyb3cgbmV3IGcoInZhbHVlIGlzIHJlcXVpcmVkLiIpO3JldHVybiBNYXRoLmFzaW4oQS5jbGFtcCh0LC0xLDEpKX0sQS5jaG9yZExlbmd0aD1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygicmFkaXVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiAyKmUqTWF0aC5zaW4odCouNSl9LEEubG9nQmFzZT1mdW5jdGlvbih0LGUpe2lmKCFwKHQpKXRocm93IG5ldyBnKCJudW1iZXIgaXMgcmVxdWlyZWQuIik7aWYoIXAoZSkpdGhyb3cgbmV3IGcoImJhc2UgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGgubG9nKHQpL01hdGgubG9nKGUpfSxBLmNicnQ9SShNYXRoLmNicnQsZnVuY3Rpb24oZSl7Y29uc3Qgbj1NYXRoLnBvdyhNYXRoLmFicyhlKSwuMzMzMzMzMzMzMzMzMzMzMyk7cmV0dXJuIGU8MD8tbjpufSksQS5sb2cyPUkoTWF0aC5sb2cyLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfSksQS5mb2c9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXQqZTtyZXR1cm4gMS1NYXRoLmV4cCgtKG4qbikpfSxBLmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm51bWJlcigieCIsdCksdCooLS4xNzg0Kk1hdGguYWJzKHQpLS4wNjYzKnQqdCsxLjAzMDEpfSxBLmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2YubnVtYmVyKCJ4Iix0KSx1LnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLHI9TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtjb25zdCBpPU1hdGgubWF4KHIsbik7bj1NYXRoLm1pbihyLG4pO2NvbnN0IG89bi9pO2lmKGlzTmFOKG8pKXRocm93IG5ldyBnKCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpO3JldHVybiByPUEuZmFzdEFwcHJveGltYXRlQXRhbihvKSxyPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP0EuUElfT1ZFUl9UV08tcjpyLHI9dDwwP0EuUEktcjpyLHI9ZTwwPy1yOnIscn07dmFyIFI9QTtmdW5jdGlvbiB4KHQsZSl7dGhpcy54PUkodCwwKSx0aGlzLnk9SShlLDApfXguZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcChuKT8obi54PXQsbi55PWUsbik6bmV3IHgodCxlKX0seC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcgeCh0LngsdC55KX0seC5mcm9tQ2FydGVzaWFuMz14LmNsb25lLHguZnJvbUNhcnRlc2lhbjQ9eC5jbG9uZSx4LnBhY2tlZExlbmd0aD0yLHgucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUuZGVmaW5lZCgiYXJyYXkiLGUpLG49SShuLDApLGVbbisrXT10LngsZVtuXT10LnksZX0seC51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LmRlZmluZWQoImFycmF5Iix0KSxlPUkoZSwwKSxwKG4pfHwobj1uZXcgeCksbi54PXRbZSsrXSxuLnk9dFtlXSxufSx4LnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjI7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyBnKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMiBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpeC5wYWNrKHRbaV0sZSxpKjIpO3JldHVybiBlfSx4LnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYodS5kZWZpbmVkKCJhcnJheSIsdCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMiksdC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IGcoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMi4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8yOmU9bmV3IEFycmF5KG4vMik7Zm9yKGxldCByPTA7cjxuO3IrPTIpe2NvbnN0IGk9ci8yO2VbaV09eC51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSx4LmZyb21BcnJheT14LnVucGFjayx4Lm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55KX0seC5taW5pbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5taW4odC54LHQueSl9LHgubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59LHgubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG59LHguY2xhbXA9ZnVuY3Rpb24odCxlLG4scil7dS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS50eXBlT2Yub2JqZWN0KCJtaW4iLGUpLHUudHlwZU9mLm9iamVjdCgibWF4IixuKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIscik7Y29uc3QgaT1SLmNsYW1wKHQueCxlLngsbi54KSxvPVIuY2xhbXAodC55LGUueSxuLnkpO3JldHVybiByLng9aSxyLnk9byxyfSx4Lm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0Lnl9LHgubWFnbml0dWRlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoeC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07Y29uc3QgWmU9bmV3IHg7eC5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHguc3VidHJhY3QodCxlLFplKSx4Lm1hZ25pdHVkZShaZSl9LHguZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseC5zdWJ0cmFjdCh0LGUsWmUpLHgubWFnbml0dWRlU3F1YXJlZChaZSl9LHgubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKTtjb25zdCBuPXgubWFnbml0dWRlKHQpO2lmKGUueD10LngvbixlLnk9dC55L24saXNOYU4oZS54KXx8aXNOYU4oZS55KSl0aHJvdyBuZXcgZygibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LHguZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55fSx4LmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fSx4Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG59LHguZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZS54LG4ueT10LnkvZS55LG59LHguYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn0seC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG59LHgubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZSxuLnk9dC55KmUsbn0seC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn0seC5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9LXQueCxlLnk9LXQueSxlfSx4LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGV9O2NvbnN0IHlyPW5ldyB4O3gubGVycD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJzdGFydCIsdCksdS50eXBlT2Yub2JqZWN0KCJlbmQiLGUpLHUudHlwZU9mLm51bWJlcigidCIsbiksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpLHgubXVsdGlwbHlCeVNjYWxhcihlLG4seXIpLHI9eC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLHIpLHguYWRkKHlyLHIscil9O2NvbnN0IEFyPW5ldyB4LHhyPW5ldyB4O3guYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseC5ub3JtYWxpemUodCxBcikseC5ub3JtYWxpemUoZSx4ciksUi5hY29zQ2xhbXBlZCh4LmRvdChBcix4cikpfTtjb25zdCBybz1uZXcgeDt4Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7Y29uc3Qgbj14Lm5vcm1hbGl6ZSh0LHJvKTtyZXR1cm4geC5hYnMobixuKSxuLng8PW4ueT9lPXguY2xvbmUoeC5VTklUX1gsZSk6ZT14LmNsb25lKHguVU5JVF9ZLGUpLGV9LHguZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxwKHQpJiZwKGUpJiZ0Lng9PT1lLngmJnQueT09PWUueX0seC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX0seC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKX0seC5aRVJPPU9iamVjdC5mcmVlemUobmV3IHgoMCwwKSkseC5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgeCgxLDEpKSx4LlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyB4KDEsMCkpLHguVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IHgoMCwxKSkseC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHguY2xvbmUodGhpcyx0KX0seC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB4LmVxdWFscyh0aGlzLHQpfSx4LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfSx4LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0pYH07ZnVuY3Rpb24gbCh0LGUsbil7dGhpcy54PUkodCwwKSx0aGlzLnk9SShlLDApLHRoaXMuej1JKG4sMCl9bC5mcm9tU3BoZXJpY2FsPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJzcGhlcmljYWwiLHQpLHAoZSl8fChlPW5ldyBsKTtjb25zdCBuPXQuY2xvY2sscj10LmNvbmUsaT1JKHQubWFnbml0dWRlLDEpLG89aSpNYXRoLnNpbihyKTtyZXR1cm4gZS54PW8qTWF0aC5jb3MobiksZS55PW8qTWF0aC5zaW4obiksZS56PWkqTWF0aC5jb3MociksZX0sbC5mcm9tRWxlbWVudHM9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHAocik/KHIueD10LHIueT1lLHIuej1uLHIpOm5ldyBsKHQsZSxuKX0sbC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBsKHQueCx0LnksdC56KX0sbC5mcm9tQ2FydGVzaWFuND1sLmNsb25lLGwucGFja2VkTGVuZ3RoPTMsbC5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS5kZWZpbmVkKCJhcnJheSIsZSksbj1JKG4sMCksZVtuKytdPXQueCxlW24rK109dC55LGVbbl09dC56LGV9LGwudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS5kZWZpbmVkKCJhcnJheSIsdCksZT1JKGUsMCkscChuKXx8KG49bmV3IGwpLG4ueD10W2UrK10sbi55PXRbZSsrXSxuLno9dFtlXSxufSxsLnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiYXJyYXkiLHQpO2NvbnN0IG49dC5sZW5ndGgscj1uKjM7aWYoIXAoZSkpZT1uZXcgQXJyYXkocik7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1yKXRocm93IG5ldyBnKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09ciYmKGUubGVuZ3RoPXIpfWZvcihsZXQgaT0wO2k8bjsrK2kpbC5wYWNrKHRbaV0sZSxpKjMpO3JldHVybiBlfSxsLnVucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7aWYodS5kZWZpbmVkKCJhcnJheSIsdCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImFycmF5Lmxlbmd0aCIsdC5sZW5ndGgsMyksdC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IGcoImFycmF5IGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMy4iKTtjb25zdCBuPXQubGVuZ3RoO3AoZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCByPTA7cjxuO3IrPTMpe2NvbnN0IGk9ci8zO2VbaV09bC51bnBhY2sodCxyLGVbaV0pfXJldHVybiBlfSxsLmZyb21BcnJheT1sLnVucGFjayxsLm1heGltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1heCh0LngsdC55LHQueil9LGwubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX0sbC5taW5pbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx1LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1pbih0LngsZS54KSxuLnk9TWF0aC5taW4odC55LGUueSksbi56PU1hdGgubWluKHQueixlLnopLG59LGwubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCksdS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5tYXgodC54LGUueCksbi55PU1hdGgubWF4KHQueSxlLnkpLG4uej1NYXRoLm1heCh0LnosZS56KSxufSxsLmNsYW1wPWZ1bmN0aW9uKHQsZSxuLHIpe3UudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUudHlwZU9mLm9iamVjdCgibWluIixlKSx1LnR5cGVPZi5vYmplY3QoIm1heCIsbiksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLHIpO2NvbnN0IGk9Ui5jbGFtcCh0LngsZS54LG4ueCksbz1SLmNsYW1wKHQueSxlLnksbi55KSxzPVIuY2xhbXAodC56LGUueixuLnopO3JldHVybiByLng9aSxyLnk9byxyLno9cyxyfSxsLm1hZ25pdHVkZVNxdWFyZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx0LngqdC54K3QueSp0LnkrdC56KnQuen0sbC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChsLm1hZ25pdHVkZVNxdWFyZWQodCkpfTtjb25zdCBRZT1uZXcgbDtsLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksbC5zdWJ0cmFjdCh0LGUsUWUpLGwubWFnbml0dWRlKFFlKX0sbC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxsLnN1YnRyYWN0KHQsZSxRZSksbC5tYWduaXR1ZGVTcXVhcmVkKFFlKX0sbC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49bC5tYWduaXR1ZGUodCk7aWYoZS54PXQueC9uLGUueT10LnkvbixlLno9dC56L24saXNOYU4oZS54KXx8aXNOYU4oZS55KXx8aXNOYU4oZS56KSl0aHJvdyBuZXcgZygibm9ybWFsaXplZCByZXN1bHQgaXMgbm90IGEgbnVtYmVyIik7cmV0dXJuIGV9LGwuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9LGwubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLngsbi55PXQueSplLnksbi56PXQueiplLnosbn0sbC5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbi56PXQuei9lLnosbn0sbC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufSxsLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC1lLngsbi55PXQueS1lLnksbi56PXQuei1lLnosbn0sbC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxuLno9dC56KmUsbn0sbC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59LGwubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZS56PS10LnosZX0sbC5hYnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixlKSxlLng9TWF0aC5hYnModC54KSxlLnk9TWF0aC5hYnModC55KSxlLno9TWF0aC5hYnModC56KSxlfTtjb25zdCBPcj1uZXcgbDtsLmxlcnA9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHUudHlwZU9mLm9iamVjdCgiZW5kIixlKSx1LnR5cGVPZi5udW1iZXIoInQiLG4pLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixyKSxsLm11bHRpcGx5QnlTY2FsYXIoZSxuLE9yKSxyPWwubXVsdGlwbHlCeVNjYWxhcih0LDEtbixyKSxsLmFkZChPcixyLHIpfTtjb25zdCBKZT1uZXcgbCxnbj1uZXcgbDtsLmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgibGVmdCIsdCksdS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksbC5ub3JtYWxpemUodCxKZSksbC5ub3JtYWxpemUoZSxnbik7Y29uc3Qgbj1sLmRvdChKZSxnbikscj1sLm1hZ25pdHVkZShsLmNyb3NzKEplLGduLEplKSk7cmV0dXJuIE1hdGguYXRhbjIocixuKX07Y29uc3QgaW89bmV3IGw7bC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2NvbnN0IG49bC5ub3JtYWxpemUodCxpbyk7cmV0dXJuIGwuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1sLmNsb25lKGwuVU5JVF9YLGUpOmU9bC5jbG9uZShsLlVOSVRfWixlKTpuLnk8PW4uej9lPWwuY2xvbmUobC5VTklUX1ksZSk6ZT1sLmNsb25lKGwuVU5JVF9aLGUpLGV9LGwucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7dS5kZWZpbmVkKCJhIix0KSx1LmRlZmluZWQoImIiLGUpLHUuZGVmaW5lZCgicmVzdWx0IixuKTtjb25zdCByPWwuZG90KHQsZSkvbC5kb3QoZSxlKTtyZXR1cm4gbC5tdWx0aXBseUJ5U2NhbGFyKGUscixuKX0sbC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQueD09PWUueCYmdC55PT09ZS55JiZ0Lno9PT1lLnp9LGwuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX0sbC5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0PT09ZXx8cCh0KSYmcChlKSYmUi5lcXVhbHNFcHNpbG9uKHQueCxlLngsbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueSxlLnksbixyKSYmUi5lcXVhbHNFcHNpbG9uKHQueixlLnosbixyKX0sbC5jcm9zcz1mdW5jdGlvbih0LGUsbil7dS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx1LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx1LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbik7Y29uc3Qgcj10LngsaT10Lnksbz10Lnoscz1lLngsaD1lLnksYT1lLnosZj1pKmEtbypoLGQ9bypzLXIqYSxfPXIqaC1pKnM7cmV0dXJuIG4ueD1mLG4ueT1kLG4uej1fLG59LGwubWlkcG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHUudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHUudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9KHQueCtlLngpKi41LG4ueT0odC55K2UueSkqLjUsbi56PSh0LnorZS56KSouNSxufSxsLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHUudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx1LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSx0PVIudG9SYWRpYW5zKHQpLGU9Ui50b1JhZGlhbnMoZSksbC5mcm9tUmFkaWFucyh0LGUsbixyLGkpfTtsZXQgbXQ9bmV3IGwsQWU9bmV3IGw7Y29uc3Qgb289bmV3IGwoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO2wuZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXt1LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksdS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksbj1JKG4sMCk7Y29uc3Qgbz1wKHIpP3IucmFkaWlTcXVhcmVkOm9vLHM9TWF0aC5jb3MoZSk7bXQueD1zKk1hdGguY29zKHQpLG10Lnk9cypNYXRoLnNpbih0KSxtdC56PU1hdGguc2luKGUpLG10PWwubm9ybWFsaXplKG10LG10KSxsLm11bHRpcGx5Q29tcG9uZW50cyhvLG10LEFlKTtjb25zdCBoPU1hdGguc3FydChsLmRvdChtdCxBZSkpO3JldHVybiBBZT1sLmRpdmlkZUJ5U2NhbGFyKEFlLGgsQWUpLG10PWwubXVsdGlwbHlCeVNjYWxhcihtdCxuLG10KSxwKGkpfHwoaT1uZXcgbCksbC5hZGQoQWUsbXQsaSl9LGwuZnJvbURlZ3JlZXNBcnJheT1mdW5jdGlvbih0LGUsbil7aWYodS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8Mnx8dC5sZW5ndGglMiE9PTApdGhyb3cgbmV3IGcoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIgYW5kIGF0IGxlYXN0IDIiKTtjb25zdCByPXQubGVuZ3RoO3Aobik/bi5sZW5ndGg9ci8yOm49bmV3IEFycmF5KHIvMik7Zm9yKGxldCBpPTA7aTxyO2krPTIpe2NvbnN0IG89dFtpXSxzPXRbaSsxXSxoPWkvMjtuW2hdPWwuZnJvbURlZ3JlZXMobyxzLDAsZSxuW2hdKX1yZXR1cm4gbn0sbC5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzI6bj1uZXcgQXJyYXkoci8yKTtmb3IobGV0IGk9MDtpPHI7aSs9Mil7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9aS8yO25baF09bC5mcm9tUmFkaWFucyhvLHMsMCxlLG5baF0pfXJldHVybiBufSxsLmZyb21EZWdyZWVzQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9dFtpKzJdLGE9aS8zO25bYV09bC5mcm9tRGVncmVlcyhvLHMsaCxlLG5bYV0pfXJldHVybiBufSxsLmZyb21SYWRpYW5zQXJyYXlIZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwzfHx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgZygidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMyBhbmQgYXQgbGVhc3QgMyIpO2NvbnN0IHI9dC5sZW5ndGg7cChuKT9uLmxlbmd0aD1yLzM6bj1uZXcgQXJyYXkoci8zKTtmb3IobGV0IGk9MDtpPHI7aSs9Myl7Y29uc3Qgbz10W2ldLHM9dFtpKzFdLGg9dFtpKzJdLGE9aS8zO25bYV09bC5mcm9tUmFkaWFucyhvLHMsaCxlLG5bYV0pfXJldHVybiBufSxsLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgbCgwLDAsMCkpLGwuT05FPU9iamVjdC5mcmVlemUobmV3IGwoMSwxLDEpKSxsLlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBsKDEsMCwwKSksbC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgbCgwLDEsMCkpLGwuVU5JVF9aPU9iamVjdC5mcmVlemUobmV3IGwoMCwwLDEpKSxsLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gbC5jbG9uZSh0aGlzLHQpfSxsLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGwuZXF1YWxzKHRoaXMsdCl9LGwucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBsLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9LGwucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSwgJHt0aGlzLnp9KWB9O2NvbnN0IHNvPW5ldyBsLGFvPW5ldyBsO2Z1bmN0aW9uIFRyKHQsZSxuLHIsaSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoImNhcnRlc2lhbiBpcyByZXF1aXJlZC4iKTtpZighcChlKSl0aHJvdyBuZXcgZygib25lT3ZlclJhZGlpIGlzIHJlcXVpcmVkLiIpO2lmKCFwKG4pKXRocm93IG5ldyBnKCJvbmVPdmVyUmFkaWlTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2lmKCFwKHIpKXRocm93IG5ldyBnKCJjZW50ZXJUb2xlcmFuY2VTcXVhcmVkIGlzIHJlcXVpcmVkLiIpO2NvbnN0IG89dC54LHM9dC55LGg9dC56LGE9ZS54LGY9ZS55LGQ9ZS56LF89bypvKmEqYSxTPXMqcypmKmYsTz1oKmgqZCpkLHc9XytTK08sYj1NYXRoLnNxcnQoMS93KSxNPWwubXVsdGlwbHlCeVNjYWxhcih0LGIsc28pO2lmKHc8cilyZXR1cm4gaXNGaW5pdGUoYik/bC5jbG9uZShNLGkpOnZvaWQgMDtjb25zdCBtPW4ueCxHPW4ueSxRPW4ueixIPWFvO0gueD1NLngqbSoyLEgueT1NLnkqRyoyLEguej1NLnoqUSoyO2xldCBpdD0oMS1iKSpsLm1hZ25pdHVkZSh0KS8oLjUqbC5tYWduaXR1ZGUoSCkpLHl0PTAsQXQsdmUsVCxVLFgsb3QsQnQsY3QsVXQseW4sQW47ZG97aXQtPXl0LFQ9MS8oMStpdCptKSxVPTEvKDEraXQqRyksWD0xLygxK2l0KlEpLG90PVQqVCxCdD1VKlUsY3Q9WCpYLFV0PW90KlQseW49QnQqVSxBbj1jdCpYLEF0PV8qb3QrUypCdCtPKmN0LTEsdmU9XypVdCptK1MqeW4qRytPKkFuKlE7Y29uc3QgSGU9LTIqdmU7eXQ9QXQvSGV9d2hpbGUoTWF0aC5hYnMoQXQpPlIuRVBTSUxPTjEyKTtyZXR1cm4gcChpKT8oaS54PW8qVCxpLnk9cypVLGkuej1oKlgsaSk6bmV3IGwobypULHMqVSxoKlgpfWZ1bmN0aW9uIHoodCxlLG4pe3RoaXMubG9uZ2l0dWRlPUkodCwwKSx0aGlzLmxhdGl0dWRlPUkoZSwwKSx0aGlzLmhlaWdodD1JKG4sMCl9ei5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHUudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLG49SShuLDApLHAocik/KHIubG9uZ2l0dWRlPXQsci5sYXRpdHVkZT1lLHIuaGVpZ2h0PW4scik6bmV3IHoodCxlLG4pfSx6LmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB1LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCksdS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1SLnRvUmFkaWFucyh0KSxlPVIudG9SYWRpYW5zKGUpLHouZnJvbVJhZGlhbnModCxlLG4scil9O2NvbnN0IGhvPW5ldyBsLGNvPW5ldyBsLHVvPW5ldyBsLGZvPW5ldyBsKDEvNjM3ODEzNywxLzYzNzgxMzcsMS82MzU2NzUyMzE0MjQ1MTc5ZS05KSxsbz1uZXcgbCgxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KSksRW89Ui5FUFNJTE9OMTt6LmZyb21DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe2NvbnN0IHI9cChlKT9lLm9uZU92ZXJSYWRpaTpmbyxpPXAoZSk/ZS5vbmVPdmVyUmFkaWlTcXVhcmVkOmxvLG89cChlKT9lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOkVvLHM9VHIodCxyLGksbyxjbyk7aWYoIXAocykpcmV0dXJuO2xldCBoPWwubXVsdGlwbHlDb21wb25lbnRzKHMsaSxobyk7aD1sLm5vcm1hbGl6ZShoLGgpO2NvbnN0IGE9bC5zdWJ0cmFjdCh0LHMsdW8pLGY9TWF0aC5hdGFuMihoLnksaC54KSxkPU1hdGguYXNpbihoLnopLF89Ui5zaWduKGwuZG90KGEsdCkpKmwubWFnbml0dWRlKGEpO3JldHVybiBwKG4pPyhuLmxvbmdpdHVkZT1mLG4ubGF0aXR1ZGU9ZCxuLmhlaWdodD1fLG4pOm5ldyB6KGYsZCxfKX0sei50b0NhcnRlc2lhbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUuZGVmaW5lZCgiY2FydG9ncmFwaGljIix0KSxsLmZyb21SYWRpYW5zKHQubG9uZ2l0dWRlLHQubGF0aXR1ZGUsdC5oZWlnaHQsZSxuKX0sei5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKHAodCkpcmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPXQubG9uZ2l0dWRlLGUubGF0aXR1ZGU9dC5sYXRpdHVkZSxlLmhlaWdodD10LmhlaWdodCxlKTpuZXcgeih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX0sei5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQubG9uZ2l0dWRlPT09ZS5sb25naXR1ZGUmJnQubGF0aXR1ZGU9PT1lLmxhdGl0dWRlJiZ0LmhlaWdodD09PWUuaGVpZ2h0fSx6LmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuPUkobiwwKSx0PT09ZXx8cCh0KSYmcChlKSYmTWF0aC5hYnModC5sb25naXR1ZGUtZS5sb25naXR1ZGUpPD1uJiZNYXRoLmFicyh0LmxhdGl0dWRlLWUubGF0aXR1ZGUpPD1uJiZNYXRoLmFicyh0LmhlaWdodC1lLmhlaWdodCk8PW59LHouWkVSTz1PYmplY3QuZnJlZXplKG5ldyB6KDAsMCwwKSksei5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHouY2xvbmUodGhpcyx0KX0sei5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB6LmVxdWFscyh0aGlzLHQpfSx6LnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHouZXF1YWxzRXBzaWxvbih0aGlzLHQsZSl9LHoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMubG9uZ2l0dWRlfSwgJHt0aGlzLmxhdGl0dWRlfSwgJHt0aGlzLmhlaWdodH0pYH07ZnVuY3Rpb24gUnIodCxlLG4scil7ZT1JKGUsMCksbj1JKG4sMCkscj1JKHIsMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIngiLGUsMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInkiLG4sMCksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLHIsMCksdC5fcmFkaWk9bmV3IGwoZSxuLHIpLHQuX3JhZGlpU3F1YXJlZD1uZXcgbChlKmUsbipuLHIqciksdC5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgbChlKmUqZSplLG4qbipuKm4scipyKnIqciksdC5fb25lT3ZlclJhZGlpPW5ldyBsKGU9PT0wPzA6MS9lLG49PT0wPzA6MS9uLHI9PT0wPzA6MS9yKSx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBsKGU9PT0wPzA6MS8oZSplKSxuPT09MD8wOjEvKG4qbikscj09PTA/MDoxLyhyKnIpKSx0Ll9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsbixyKSx0Ll9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsbixyKSx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPVIuRVBTSUxPTjEsdC5fcmFkaWlTcXVhcmVkLnohPT0wJiYodC5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dC5fcmFkaWlTcXVhcmVkLngvdC5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIGoodCxlLG4pe3RoaXMuX3JhZGlpPXZvaWQgMCx0aGlzLl9yYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3JhZGlpVG9UaGVGb3VydGg9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaT12b2lkIDAsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZD12b2lkIDAsdGhpcy5fbWluaW11bVJhZGl1cz12b2lkIDAsdGhpcy5fbWF4aW11bVJhZGl1cz12b2lkIDAsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD12b2lkIDAsdGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dm9pZCAwLFJyKHRoaXMsdCxlLG4pfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGoucHJvdG90eXBlLHtyYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpfX0scmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlTcXVhcmVkfX0scmFkaWlUb1RoZUZvdXJ0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpVG9UaGVGb3VydGh9fSxvbmVPdmVyUmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWl9fSxvbmVPdmVyUmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZH19LG1pbmltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzfX0sbWF4aW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXN9fX0pLGouY2xvbmU9ZnVuY3Rpb24odCxlKXtpZighcCh0KSlyZXR1cm47Y29uc3Qgbj10Ll9yYWRpaTtyZXR1cm4gcChlKT8obC5jbG9uZShuLGUuX3JhZGlpKSxsLmNsb25lKHQuX3JhZGlpU3F1YXJlZCxlLl9yYWRpaVNxdWFyZWQpLGwuY2xvbmUodC5fcmFkaWlUb1RoZUZvdXJ0aCxlLl9yYWRpaVRvVGhlRm91cnRoKSxsLmNsb25lKHQuX29uZU92ZXJSYWRpaSxlLl9vbmVPdmVyUmFkaWkpLGwuY2xvbmUodC5fb25lT3ZlclJhZGlpU3F1YXJlZCxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkKSxlLl9taW5pbXVtUmFkaXVzPXQuX21pbmltdW1SYWRpdXMsZS5fbWF4aW11bVJhZGl1cz10Ll9tYXhpbXVtUmFkaXVzLGUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKTpuZXcgaihuLngsbi55LG4ueil9LGouZnJvbUNhcnRlc2lhbjM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChlKXx8KGU9bmV3IGopLHAodCkmJlJyKGUsdC54LHQueSx0LnopLGV9LGouV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgaig2Mzc4MTM3LDYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSkpLGouVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgaigxLDEsMSkpLGouTU9PTj1PYmplY3QuZnJlZXplKG5ldyBqKFIuTFVOQVJfUkFESVVTLFIuTFVOQVJfUkFESVVTLFIuTFVOQVJfUkFESVVTKSksai5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGouY2xvbmUodGhpcyx0KX0sai5wYWNrZWRMZW5ndGg9bC5wYWNrZWRMZW5ndGgsai5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJ2YWx1ZSIsdCksdS5kZWZpbmVkKCJhcnJheSIsZSksbj1JKG4sMCksbC5wYWNrKHQuX3JhZGlpLGUsbiksZX0sai51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3UuZGVmaW5lZCgiYXJyYXkiLHQpLGU9SShlLDApO2NvbnN0IHI9bC51bnBhY2sodCxlKTtyZXR1cm4gai5mcm9tQ2FydGVzaWFuMyhyLG4pfSxqLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1sLm5vcm1hbGl6ZSxqLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoImNhcnRvZ3JhcGhpYyIsdCk7Y29uc3Qgbj10LmxvbmdpdHVkZSxyPXQubGF0aXR1ZGUsaT1NYXRoLmNvcyhyKSxvPWkqTWF0aC5jb3Mobikscz1pKk1hdGguc2luKG4pLGg9TWF0aC5zaW4ocik7cmV0dXJuIHAoZSl8fChlPW5ldyBsKSxlLng9byxlLnk9cyxlLno9aCxsLm5vcm1hbGl6ZShlLGUpfSxqLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlKXtpZighbC5lcXVhbHNFcHNpbG9uKHQsbC5aRVJPLFIuRVBTSUxPTjE0KSlyZXR1cm4gcChlKXx8KGU9bmV3IGwpLGU9bC5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLGUpLGwubm9ybWFsaXplKGUsZSl9O2NvbnN0IF9vPW5ldyBsLHBvPW5ldyBsO2oucHJvdG90eXBlLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj1fbyxyPXBvO3RoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKHQsbiksbC5tdWx0aXBseUNvbXBvbmVudHModGhpcy5fcmFkaWlTcXVhcmVkLG4scik7Y29uc3QgaT1NYXRoLnNxcnQobC5kb3QobixyKSk7cmV0dXJuIGwuZGl2aWRlQnlTY2FsYXIocixpLHIpLGwubXVsdGlwbHlCeVNjYWxhcihuLHQuaGVpZ2h0LG4pLHAoZSl8fChlPW5ldyBsKSxsLmFkZChyLG4sZSl9LGoucHJvdG90eXBlLmNhcnRvZ3JhcGhpY0FycmF5VG9DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsdCk7Y29uc3Qgbj10Lmxlbmd0aDtwKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCByPTA7cjxuO3IrKyllW3JdPXRoaXMuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4odFtyXSxlW3JdKTtyZXR1cm4gZX07Y29uc3QgeW89bmV3IGwsQW89bmV3IGwseG89bmV3IGw7ai5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZSh0LEFvKTtpZighcChuKSlyZXR1cm47Y29uc3Qgcj10aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbChuLHlvKSxpPWwuc3VidHJhY3QodCxuLHhvKSxvPU1hdGguYXRhbjIoci55LHIueCkscz1NYXRoLmFzaW4oci56KSxoPVIuc2lnbihsLmRvdChpLHQpKSpsLm1hZ25pdHVkZShpKTtyZXR1cm4gcChlKT8oZS5sb25naXR1ZGU9byxlLmxhdGl0dWRlPXMsZS5oZWlnaHQ9aCxlKTpuZXcgeihvLHMsaCl9LGoucHJvdG90eXBlLmNhcnRlc2lhbkFycmF5VG9DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydGVzaWFucyIsdCk7Y29uc3Qgbj10Lmxlbmd0aDtwKGUpP2UubGVuZ3RoPW46ZT1uZXcgQXJyYXkobik7Zm9yKGxldCByPTA7cjxuOysrcillW3JdPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtyXSxlW3JdKTtyZXR1cm4gZX0sai5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBUcih0LHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsZSl9LGoucHJvdG90eXBlLnNjYWxlVG9HZW9jZW50cmljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3UudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxwKGUpfHwoZT1uZXcgbCk7Y29uc3Qgbj10Lngscj10LnksaT10Lnosbz10aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHM9MS9NYXRoLnNxcnQobipuKm8ueCtyKnIqby55K2kqaSpvLnopO3JldHVybiBsLm11bHRpcGx5QnlTY2FsYXIodCxzLGUpfSxqLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcChlKXx8KGU9bmV3IGwpLGwubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fb25lT3ZlclJhZGlpLGUpfSxqLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBwKGUpfHwoZT1uZXcgbCksbC5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9yYWRpaSxlKX0sai5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzPT09dHx8cCh0KSYmbC5lcXVhbHModGhpcy5fcmFkaWksdC5fcmFkaWkpfSxqLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfSxqLnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzPWZ1bmN0aW9uKHQsZSxuKXtpZih1LnR5cGVPZi5vYmplY3QoInBvc2l0aW9uIix0KSwhUi5lcXVhbHNFcHNpbG9uKHRoaXMuX3JhZGlpLngsdGhpcy5fcmFkaWkueSxSLkVQU0lMT04xNSkpdGhyb3cgbmV3IGcoIkVsbGlwc29pZCBtdXN0IGJlIGFuIGVsbGlwc29pZCBvZiByZXZvbHV0aW9uIChyYWRpaS54ID09IHJhZGlpLnkpIik7dS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuKCJFbGxpcHNvaWQucmFkaWkueiIsdGhpcy5fcmFkaWkueiwwKSxlPUkoZSwwKTtjb25zdCByPXRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaO2lmKHAobil8fChuPW5ldyBsKSxuLng9MCxuLnk9MCxuLno9dC56KigxLXIpLCEoTWF0aC5hYnMobi56KT49dGhpcy5fcmFkaWkuei1lKSlyZXR1cm4gbn07Y29uc3QgT289Wy4xNDg4NzQzMzg5ODE2MywuNDMzMzk1Mzk0MTI5MjUsLjY3OTQwOTU2ODI5OTAyLC44NjUwNjMzNjY2ODg5OCwuOTczOTA2NTI4NTE3MTcsMF0sVG89Wy4yOTU1MjQyMjQ3MTQ3NSwuMjY5MjY2NzE5MzA5OTksLjIxOTA4NjM2MjUxNTk4LC4xNDk0NTEzNDkxNTA1OCwuMDY2NjcxMzQ0MzA4Njg0LDBdO2Z1bmN0aW9uIGJyKHQsZSxuKXt1LnR5cGVPZi5udW1iZXIoImEiLHQpLHUudHlwZU9mLm51bWJlcigiYiIsZSksdS50eXBlT2YuZnVuYygiZnVuYyIsbik7Y29uc3Qgcj0uNSooZSt0KSxpPS41KihlLXQpO2xldCBvPTA7Zm9yKGxldCBzPTA7czw1O3MrKyl7Y29uc3QgaD1pKk9vW3NdO28rPVRvW3NdKihuKHIraCkrbihyLWgpKX1yZXR1cm4gbyo9aSxvfWoucHJvdG90eXBlLnN1cmZhY2VBcmVhPWZ1bmN0aW9uKHQpe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KTtjb25zdCBlPXQud2VzdDtsZXQgbj10LmVhc3Q7Y29uc3Qgcj10LnNvdXRoLGk9dC5ub3J0aDtmb3IoO248ZTspbis9Ui5UV09fUEk7Y29uc3Qgbz10aGlzLl9yYWRpaVNxdWFyZWQscz1vLngsaD1vLnksYT1vLnosZj1zKmg7cmV0dXJuIGJyKHIsaSxmdW5jdGlvbihkKXtjb25zdCBfPU1hdGguY29zKGQpLFM9TWF0aC5zaW4oZCk7cmV0dXJuIE1hdGguY29zKGQpKmJyKGUsbixmdW5jdGlvbihPKXtjb25zdCB3PU1hdGguY29zKE8pLGI9TWF0aC5zaW4oTyk7cmV0dXJuIE1hdGguc3FydChmKlMqUythKihoKncqdytzKmIqYikqXypfKX0pfSl9O2Z1bmN0aW9uIE4odCxlLG4scil7dGhpcy53ZXN0PUkodCwwKSx0aGlzLnNvdXRoPUkoZSwwKSx0aGlzLmVhc3Q9SShuLDApLHRoaXMubm9ydGg9SShyLDApfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE4ucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE4uY29tcHV0ZVdpZHRoKHRoaXMpfX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTi5jb21wdXRlSGVpZ2h0KHRoaXMpfX19KSxOLnBhY2tlZExlbmd0aD00LE4ucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHUuZGVmaW5lZCgiYXJyYXkiLGUpLG49SShuLDApLGVbbisrXT10Lndlc3QsZVtuKytdPXQuc291dGgsZVtuKytdPXQuZWFzdCxlW25dPXQubm9ydGgsZX0sTi51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1LmRlZmluZWQoImFycmF5Iix0KSxlPUkoZSwwKSxwKG4pfHwobj1uZXcgTiksbi53ZXN0PXRbZSsrXSxuLnNvdXRoPXRbZSsrXSxuLmVhc3Q9dFtlKytdLG4ubm9ydGg9dFtlXSxufSxOLmNvbXB1dGVXaWR0aD1mdW5jdGlvbih0KXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7bGV0IGU9dC5lYXN0O2NvbnN0IG49dC53ZXN0O3JldHVybiBlPG4mJihlKz1SLlRXT19QSSksZS1ufSxOLmNvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx0Lm5vcnRoLXQuc291dGh9LE4uZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdD1SLnRvUmFkaWFucyhJKHQsMCkpLGU9Ui50b1JhZGlhbnMoSShlLDApKSxuPVIudG9SYWRpYW5zKEkobiwwKSkscj1SLnRvUmFkaWFucyhJKHIsMCkpLHAoaSk/KGkud2VzdD10LGkuc291dGg9ZSxpLmVhc3Q9bixpLm5vcnRoPXIsaSk6bmV3IE4odCxlLG4scil9LE4uZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gcChpKT8oaS53ZXN0PUkodCwwKSxpLnNvdXRoPUkoZSwwKSxpLmVhc3Q9SShuLDApLGkubm9ydGg9SShyLDApLGkpOm5ldyBOKHQsZSxuLHIpfSxOLmZyb21DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbih0LGUpe3UuZGVmaW5lZCgiY2FydG9ncmFwaGljcyIsdCk7bGV0IG49TnVtYmVyLk1BWF9WQUxVRSxyPS1OdW1iZXIuTUFYX1ZBTFVFLGk9TnVtYmVyLk1BWF9WQUxVRSxvPS1OdW1iZXIuTUFYX1ZBTFVFLHM9TnVtYmVyLk1BWF9WQUxVRSxoPS1OdW1iZXIuTUFYX1ZBTFVFO2ZvcihsZXQgYT0wLGY9dC5sZW5ndGg7YTxmO2ErKyl7Y29uc3QgZD10W2FdO249TWF0aC5taW4obixkLmxvbmdpdHVkZSkscj1NYXRoLm1heChyLGQubG9uZ2l0dWRlKSxzPU1hdGgubWluKHMsZC5sYXRpdHVkZSksaD1NYXRoLm1heChoLGQubGF0aXR1ZGUpO2NvbnN0IF89ZC5sb25naXR1ZGU+PTA/ZC5sb25naXR1ZGU6ZC5sb25naXR1ZGUrUi5UV09fUEk7aT1NYXRoLm1pbihpLF8pLG89TWF0aC5tYXgobyxfKX1yZXR1cm4gci1uPm8taSYmKG49aSxyPW8scj5SLlBJJiYocj1yLVIuVFdPX1BJKSxuPlIuUEkmJihuPW4tUi5UV09fUEkpKSxwKGUpPyhlLndlc3Q9bixlLnNvdXRoPXMsZS5lYXN0PXIsZS5ub3J0aD1oLGUpOm5ldyBOKG4scyxyLGgpfSxOLmZyb21DYXJ0ZXNpYW5BcnJheT1mdW5jdGlvbih0LGUsbil7dS5kZWZpbmVkKCJjYXJ0ZXNpYW5zIix0KSxlPUkoZSxqLldHUzg0KTtsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFLGk9LU51bWJlci5NQVhfVkFMVUUsbz1OdW1iZXIuTUFYX1ZBTFVFLHM9LU51bWJlci5NQVhfVkFMVUUsaD1OdW1iZXIuTUFYX1ZBTFVFLGE9LU51bWJlci5NQVhfVkFMVUU7Zm9yKGxldCBmPTAsZD10Lmxlbmd0aDtmPGQ7ZisrKXtjb25zdCBfPWUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWModFtmXSk7cj1NYXRoLm1pbihyLF8ubG9uZ2l0dWRlKSxpPU1hdGgubWF4KGksXy5sb25naXR1ZGUpLGg9TWF0aC5taW4oaCxfLmxhdGl0dWRlKSxhPU1hdGgubWF4KGEsXy5sYXRpdHVkZSk7Y29uc3QgUz1fLmxvbmdpdHVkZT49MD9fLmxvbmdpdHVkZTpfLmxvbmdpdHVkZStSLlRXT19QSTtvPU1hdGgubWluKG8sUykscz1NYXRoLm1heChzLFMpfXJldHVybiBpLXI+cy1vJiYocj1vLGk9cyxpPlIuUEkmJihpPWktUi5UV09fUEkpLHI+Ui5QSSYmKHI9ci1SLlRXT19QSSkpLHAobik/KG4ud2VzdD1yLG4uc291dGg9aCxuLmVhc3Q9aSxuLm5vcnRoPWEsbik6bmV3IE4ocixoLGksYSl9LE4uY2xvbmU9ZnVuY3Rpb24odCxlKXtpZihwKHQpKXJldHVybiBwKGUpPyhlLndlc3Q9dC53ZXN0LGUuc291dGg9dC5zb3V0aCxlLmVhc3Q9dC5lYXN0LGUubm9ydGg9dC5ub3J0aCxlKTpuZXcgTih0Lndlc3QsdC5zb3V0aCx0LmVhc3QsdC5ub3J0aCl9LE4uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49SShuLDApLHQ9PT1lfHxwKHQpJiZwKGUpJiZNYXRoLmFicyh0Lndlc3QtZS53ZXN0KTw9biYmTWF0aC5hYnModC5zb3V0aC1lLnNvdXRoKTw9biYmTWF0aC5hYnModC5lYXN0LWUuZWFzdCk8PW4mJk1hdGguYWJzKHQubm9ydGgtZS5ub3J0aCk8PW59LE4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBOLmNsb25lKHRoaXMsdCl9LE4ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gTi5lcXVhbHModGhpcyx0KX0sTi5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fHAodCkmJnAoZSkmJnQud2VzdD09PWUud2VzdCYmdC5zb3V0aD09PWUuc291dGgmJnQuZWFzdD09PWUuZWFzdCYmdC5ub3J0aD09PWUubm9ydGh9LE4ucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gTi5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlKX0sTi52YWxpZGF0ZT1mdW5jdGlvbih0KXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7Y29uc3QgZT10Lm5vcnRoO3UudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJub3J0aCIsZSwtUi5QSV9PVkVSX1RXTyksdS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIm5vcnRoIixlLFIuUElfT1ZFUl9UV08pO2NvbnN0IG49dC5zb3V0aDt1LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygic291dGgiLG4sLVIuUElfT1ZFUl9UV08pLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJzb3V0aCIsbixSLlBJX09WRVJfVFdPKTtjb25zdCByPXQud2VzdDt1LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygid2VzdCIsciwtTWF0aC5QSSksdS50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHMoIndlc3QiLHIsTWF0aC5QSSk7Y29uc3QgaT10LmVhc3Q7dS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoImVhc3QiLGksLU1hdGguUEkpLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJlYXN0IixpLE1hdGguUEkpfSxOLnNvdXRod2VzdD1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC53ZXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyB6KHQud2VzdCx0LnNvdXRoKX0sTi5ub3J0aHdlc3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHAoZSk/KGUubG9uZ2l0dWRlPXQud2VzdCxlLmxhdGl0dWRlPXQubm9ydGgsZS5oZWlnaHQ9MCxlKTpuZXcgeih0Lndlc3QsdC5ub3J0aCl9LE4ubm9ydGhlYXN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSxwKGUpPyhlLmxvbmdpdHVkZT10LmVhc3QsZS5sYXRpdHVkZT10Lm5vcnRoLGUuaGVpZ2h0PTAsZSk6bmV3IHoodC5lYXN0LHQubm9ydGgpfSxOLnNvdXRoZWFzdD1mdW5jdGlvbih0LGUpe3JldHVybiB1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCkscChlKT8oZS5sb25naXR1ZGU9dC5lYXN0LGUubGF0aXR1ZGU9dC5zb3V0aCxlLmhlaWdodD0wLGUpOm5ldyB6KHQuZWFzdCx0LnNvdXRoKX0sTi5jZW50ZXI9ZnVuY3Rpb24odCxlKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCk7bGV0IG49dC5lYXN0O2NvbnN0IHI9dC53ZXN0O248ciYmKG4rPVIuVFdPX1BJKTtjb25zdCBpPVIubmVnYXRpdmVQaVRvUGkoKHIrbikqLjUpLG89KHQuc291dGgrdC5ub3J0aCkqLjU7cmV0dXJuIHAoZSk/KGUubG9uZ2l0dWRlPWksZS5sYXRpdHVkZT1vLGUuaGVpZ2h0PTAsZSk6bmV3IHooaSxvKX0sTi5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx1LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtsZXQgcj10LmVhc3QsaT10Lndlc3Qsbz1lLmVhc3Qscz1lLndlc3Q7cjxpJiZvPjA/cis9Ui5UV09fUEk6bzxzJiZyPjAmJihvKz1SLlRXT19QSSkscjxpJiZzPDA/cys9Ui5UV09fUEk6bzxzJiZpPDAmJihpKz1SLlRXT19QSSk7Y29uc3QgaD1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KGkscykpLGE9Ui5uZWdhdGl2ZVBpVG9QaShNYXRoLm1pbihyLG8pKTtpZigodC53ZXN0PHQuZWFzdHx8ZS53ZXN0PGUuZWFzdCkmJmE8PWgpcmV0dXJuO2NvbnN0IGY9TWF0aC5tYXgodC5zb3V0aCxlLnNvdXRoKSxkPU1hdGgubWluKHQubm9ydGgsZS5ub3J0aCk7aWYoIShmPj1kKSlyZXR1cm4gcChuKT8obi53ZXN0PWgsbi5zb3V0aD1mLG4uZWFzdD1hLG4ubm9ydGg9ZCxuKTpuZXcgTihoLGYsYSxkKX0sTi5zaW1wbGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe3UudHlwZU9mLm9iamVjdCgicmVjdGFuZ2xlIix0KSx1LnR5cGVPZi5vYmplY3QoIm90aGVyUmVjdGFuZ2xlIixlKTtjb25zdCByPU1hdGgubWF4KHQud2VzdCxlLndlc3QpLGk9TWF0aC5tYXgodC5zb3V0aCxlLnNvdXRoKSxvPU1hdGgubWluKHQuZWFzdCxlLmVhc3QpLHM9TWF0aC5taW4odC5ub3J0aCxlLm5vcnRoKTtpZighKGk+PXN8fHI+PW8pKXJldHVybiBwKG4pPyhuLndlc3Q9cixuLnNvdXRoPWksbi5lYXN0PW8sbi5ub3J0aD1zLG4pOm5ldyBOKHIsaSxvLHMpfSxOLnVuaW9uPWZ1bmN0aW9uKHQsZSxuKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksdS50eXBlT2Yub2JqZWN0KCJvdGhlclJlY3RhbmdsZSIsZSkscChuKXx8KG49bmV3IE4pO2xldCByPXQuZWFzdCxpPXQud2VzdCxvPWUuZWFzdCxzPWUud2VzdDtyPGkmJm8+MD9yKz1SLlRXT19QSTpvPHMmJnI+MCYmKG8rPVIuVFdPX1BJKSxyPGkmJnM8MD9zKz1SLlRXT19QSTpvPHMmJmk8MCYmKGkrPVIuVFdPX1BJKTtjb25zdCBoPVIubmVnYXRpdmVQaVRvUGkoTWF0aC5taW4oaSxzKSksYT1SLm5lZ2F0aXZlUGlUb1BpKE1hdGgubWF4KHIsbykpO3JldHVybiBuLndlc3Q9aCxuLnNvdXRoPU1hdGgubWluKHQuc291dGgsZS5zb3V0aCksbi5lYXN0PWEsbi5ub3J0aD1NYXRoLm1heCh0Lm5vcnRoLGUubm9ydGgpLG59LE4uZXhwYW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKSxwKG4pfHwobj1uZXcgTiksbi53ZXN0PU1hdGgubWluKHQud2VzdCxlLmxvbmdpdHVkZSksbi5zb3V0aD1NYXRoLm1pbih0LnNvdXRoLGUubGF0aXR1ZGUpLG4uZWFzdD1NYXRoLm1heCh0LmVhc3QsZS5sb25naXR1ZGUpLG4ubm9ydGg9TWF0aC5tYXgodC5ub3J0aCxlLmxhdGl0dWRlKSxufSxOLmNvbnRhaW5zPWZ1bmN0aW9uKHQsZSl7dS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm9iamVjdCgiY2FydG9ncmFwaGljIixlKTtsZXQgbj1lLmxvbmdpdHVkZTtjb25zdCByPWUubGF0aXR1ZGUsaT10Lndlc3Q7bGV0IG89dC5lYXN0O3JldHVybiBvPGkmJihvKz1SLlRXT19QSSxuPDAmJihuKz1SLlRXT19QSSkpLChuPml8fFIuZXF1YWxzRXBzaWxvbihuLGksUi5FUFNJTE9OMTQpKSYmKG48b3x8Ui5lcXVhbHNFcHNpbG9uKG4sbyxSLkVQU0lMT04xNCkpJiZyPj10LnNvdXRoJiZyPD10Lm5vcnRofTtjb25zdCBSbz1uZXcgejtOLnN1YnNhbXBsZT1mdW5jdGlvbih0LGUsbixyKXt1LnR5cGVPZi5vYmplY3QoInJlY3RhbmdsZSIsdCksZT1JKGUsai5XR1M4NCksbj1JKG4sMCkscChyKXx8KHI9W10pO2xldCBpPTA7Y29uc3Qgbz10Lm5vcnRoLHM9dC5zb3V0aCxoPXQuZWFzdCxhPXQud2VzdCxmPVJvO2YuaGVpZ2h0PW4sZi5sb25naXR1ZGU9YSxmLmxhdGl0dWRlPW8scltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubG9uZ2l0dWRlPWgscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubGF0aXR1ZGU9cyxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyssZi5sb25naXR1ZGU9YSxyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyssbzwwP2YubGF0aXR1ZGU9bzpzPjA/Zi5sYXRpdHVkZT1zOmYubGF0aXR1ZGU9MDtmb3IobGV0IGQ9MTtkPDg7KytkKWYubG9uZ2l0dWRlPS1NYXRoLlBJK2QqUi5QSV9PVkVSX1RXTyxOLmNvbnRhaW5zKHQsZikmJihyW2ldPWUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZixyW2ldKSxpKyspO3JldHVybiBmLmxhdGl0dWRlPT09MCYmKGYubG9uZ2l0dWRlPWEscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrLGYubG9uZ2l0dWRlPWgscltpXT1lLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGYscltpXSksaSsrKSxyLmxlbmd0aD1pLHJ9LE4uc3Vic2VjdGlvbj1mdW5jdGlvbih0LGUsbixyLGksbyl7aWYodS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpLHUudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygid2VzdExlcnAiLGUsMSksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInNvdXRoTGVycCIsbiwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygic291dGhMZXJwIixuLDEpLHUudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJlYXN0TGVycCIsciwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygiZWFzdExlcnAiLHIsMSksdS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIm5vcnRoTGVycCIsaSwwKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygibm9ydGhMZXJwIixpLDEpLHUudHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzKCJ3ZXN0TGVycCIsZSxyKSx1LnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscygic291dGhMZXJwIixuLGkpLHAobyl8fChvPW5ldyBOKSx0Lndlc3Q8PXQuZWFzdCl7Y29uc3QgaD10LmVhc3QtdC53ZXN0O28ud2VzdD10Lndlc3QrZSpoLG8uZWFzdD10Lndlc3QrcipofWVsc2V7Y29uc3QgaD1SLlRXT19QSSt0LmVhc3QtdC53ZXN0O28ud2VzdD1SLm5lZ2F0aXZlUGlUb1BpKHQud2VzdCtlKmgpLG8uZWFzdD1SLm5lZ2F0aXZlUGlUb1BpKHQud2VzdCtyKmgpfWNvbnN0IHM9dC5ub3J0aC10LnNvdXRoO3JldHVybiBvLnNvdXRoPXQuc291dGgrbipzLG8ubm9ydGg9dC5zb3V0aCtpKnMsZT09PTEmJihvLndlc3Q9dC5lYXN0KSxyPT09MSYmKG8uZWFzdD10LmVhc3QpLG49PT0xJiYoby5zb3V0aD10Lm5vcnRoKSxpPT09MSYmKG8ubm9ydGg9dC5ub3J0aCksb30sTi5NQVhfVkFMVUU9T2JqZWN0LmZyZWV6ZShuZXcgTigtTWF0aC5QSSwtUi5QSV9PVkVSX1RXTyxNYXRoLlBJLFIuUElfT1ZFUl9UV08pKTt2YXIgZ3I9T2JqZWN0LmZyZWV6ZSh7REVQVEhfQlVGRkVSX0JJVDoyNTYsU1RFTkNJTF9CVUZGRVJfQklUOjEwMjQsQ09MT1JfQlVGRkVSX0JJVDoxNjM4NCxQT0lOVFM6MCxMSU5FUzoxLExJTkVfTE9PUDoyLExJTkVfU1RSSVA6MyxUUklBTkdMRVM6NCxUUklBTkdMRV9TVFJJUDo1LFRSSUFOR0xFX0ZBTjo2LFpFUk86MCxPTkU6MSxTUkNfQ09MT1I6NzY4LE9ORV9NSU5VU19TUkNfQ09MT1I6NzY5LFNSQ19BTFBIQTo3NzAsT05FX01JTlVTX1NSQ19BTFBIQTo3NzEsRFNUX0FMUEhBOjc3MixPTkVfTUlOVVNfRFNUX0FMUEhBOjc3MyxEU1RfQ09MT1I6Nzc0LE9ORV9NSU5VU19EU1RfQ09MT1I6Nzc1LFNSQ19BTFBIQV9TQVRVUkFURTo3NzYsRlVOQ19BREQ6MzI3NzQsQkxFTkRfRVFVQVRJT046MzI3NzcsQkxFTkRfRVFVQVRJT05fUkdCOjMyNzc3LEJMRU5EX0VRVUFUSU9OX0FMUEhBOjM0ODc3LEZVTkNfU1VCVFJBQ1Q6MzI3NzgsRlVOQ19SRVZFUlNFX1NVQlRSQUNUOjMyNzc5LEJMRU5EX0RTVF9SR0I6MzI5NjgsQkxFTkRfU1JDX1JHQjozMjk2OSxCTEVORF9EU1RfQUxQSEE6MzI5NzAsQkxFTkRfU1JDX0FMUEhBOjMyOTcxLENPTlNUQU5UX0NPTE9SOjMyNzY5LE9ORV9NSU5VU19DT05TVEFOVF9DT0xPUjozMjc3MCxDT05TVEFOVF9BTFBIQTozMjc3MSxPTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6MzI3NzIsQkxFTkRfQ09MT1I6MzI3NzMsQVJSQVlfQlVGRkVSOjM0OTYyLEVMRU1FTlRfQVJSQVlfQlVGRkVSOjM0OTYzLEFSUkFZX0JVRkZFUl9CSU5ESU5HOjM0OTY0LEVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NjUsU1RSRUFNX0RSQVc6MzUwNDAsU1RBVElDX0RSQVc6MzUwNDQsRFlOQU1JQ19EUkFXOjM1MDQ4LEJVRkZFUl9TSVpFOjM0NjYwLEJVRkZFUl9VU0FHRTozNDY2MSxDVVJSRU5UX1ZFUlRFWF9BVFRSSUI6MzQzNDIsRlJPTlQ6MTAyOCxCQUNLOjEwMjksRlJPTlRfQU5EX0JBQ0s6MTAzMixDVUxMX0ZBQ0U6Mjg4NCxCTEVORDozMDQyLERJVEhFUjozMDI0LFNURU5DSUxfVEVTVDoyOTYwLERFUFRIX1RFU1Q6MjkyOSxTQ0lTU09SX1RFU1Q6MzA4OSxQT0xZR09OX09GRlNFVF9GSUxMOjMyODIzLFNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRTozMjkyNixTQU1QTEVfQ09WRVJBR0U6MzI5MjgsTk9fRVJST1I6MCxJTlZBTElEX0VOVU06MTI4MCxJTlZBTElEX1ZBTFVFOjEyODEsSU5WQUxJRF9PUEVSQVRJT046MTI4MixPVVRfT0ZfTUVNT1JZOjEyODUsQ1c6MjMwNCxDQ1c6MjMwNSxMSU5FX1dJRFRIOjI4NDksQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFOjMzOTAxLEFMSUFTRURfTElORV9XSURUSF9SQU5HRTozMzkwMixDVUxMX0ZBQ0VfTU9ERToyODg1LEZST05UX0ZBQ0U6Mjg4NixERVBUSF9SQU5HRToyOTI4LERFUFRIX1dSSVRFTUFTSzoyOTMwLERFUFRIX0NMRUFSX1ZBTFVFOjI5MzEsREVQVEhfRlVOQzoyOTMyLFNURU5DSUxfQ0xFQVJfVkFMVUU6Mjk2MSxTVEVOQ0lMX0ZVTkM6Mjk2MixTVEVOQ0lMX0ZBSUw6Mjk2NCxTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDoyOTY1LFNURU5DSUxfUEFTU19ERVBUSF9QQVNTOjI5NjYsU1RFTkNJTF9SRUY6Mjk2NyxTVEVOQ0lMX1ZBTFVFX01BU0s6Mjk2MyxTVEVOQ0lMX1dSSVRFTUFTSzoyOTY4LFNURU5DSUxfQkFDS19GVU5DOjM0ODE2LFNURU5DSUxfQkFDS19GQUlMOjM0ODE3LFNURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUw6MzQ4MTgsU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUzozNDgxOSxTVEVOQ0lMX0JBQ0tfUkVGOjM2MDAzLFNURU5DSUxfQkFDS19WQUxVRV9NQVNLOjM2MDA0LFNURU5DSUxfQkFDS19XUklURU1BU0s6MzYwMDUsVklFV1BPUlQ6Mjk3OCxTQ0lTU09SX0JPWDozMDg4LENPTE9SX0NMRUFSX1ZBTFVFOjMxMDYsQ09MT1JfV1JJVEVNQVNLOjMxMDcsVU5QQUNLX0FMSUdOTUVOVDozMzE3LFBBQ0tfQUxJR05NRU5UOjMzMzMsTUFYX1RFWFRVUkVfU0laRTozMzc5LE1BWF9WSUVXUE9SVF9ESU1TOjMzODYsU1VCUElYRUxfQklUUzozNDA4LFJFRF9CSVRTOjM0MTAsR1JFRU5fQklUUzozNDExLEJMVUVfQklUUzozNDEyLEFMUEhBX0JJVFM6MzQxMyxERVBUSF9CSVRTOjM0MTQsU1RFTkNJTF9CSVRTOjM0MTUsUE9MWUdPTl9PRkZTRVRfVU5JVFM6MTA3NTIsUE9MWUdPTl9PRkZTRVRfRkFDVE9SOjMyODI0LFRFWFRVUkVfQklORElOR18yRDozMjg3MyxTQU1QTEVfQlVGRkVSUzozMjkzNixTQU1QTEVTOjMyOTM3LFNBTVBMRV9DT1ZFUkFHRV9WQUxVRTozMjkzOCxTQU1QTEVfQ09WRVJBR0VfSU5WRVJUOjMyOTM5LENPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOjM0NDY3LERPTlRfQ0FSRTo0MzUyLEZBU1RFU1Q6NDM1MyxOSUNFU1Q6NDM1NCxHRU5FUkFURV9NSVBNQVBfSElOVDozMzE3MCxCWVRFOjUxMjAsVU5TSUdORURfQllURTo1MTIxLFNIT1JUOjUxMjIsVU5TSUdORURfU0hPUlQ6NTEyMyxJTlQ6NTEyNCxVTlNJR05FRF9JTlQ6NTEyNSxGTE9BVDo1MTI2LERFUFRIX0NPTVBPTkVOVDo2NDAyLEFMUEhBOjY0MDYsUkdCOjY0MDcsUkdCQTo2NDA4LExVTUlOQU5DRTo2NDA5LExVTUlOQU5DRV9BTFBIQTo2NDEwLFVOU0lHTkVEX1NIT1JUXzRfNF80XzQ6MzI4MTksVU5TSUdORURfU0hPUlRfNV81XzVfMTozMjgyMCxVTlNJR05FRF9TSE9SVF81XzZfNTozMzYzNSxGUkFHTUVOVF9TSEFERVI6MzU2MzIsVkVSVEVYX1NIQURFUjozNTYzMyxNQVhfVkVSVEVYX0FUVFJJQlM6MzQ5MjEsTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6MzYzNDcsTUFYX1ZBUllJTkdfVkVDVE9SUzozNjM0OCxNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzozNTY2MSxNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzU2NjAsTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFM6MzQ5MzAsTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzozNjM0OSxTSEFERVJfVFlQRTozNTY2MyxERUxFVEVfU1RBVFVTOjM1NzEyLExJTktfU1RBVFVTOjM1NzE0LFZBTElEQVRFX1NUQVRVUzozNTcxNSxBVFRBQ0hFRF9TSEFERVJTOjM1NzE3LEFDVElWRV9VTklGT1JNUzozNTcxOCxBQ1RJVkVfQVRUUklCVVRFUzozNTcyMSxTSEFESU5HX0xBTkdVQUdFX1ZFUlNJT046MzU3MjQsQ1VSUkVOVF9QUk9HUkFNOjM1NzI1LE5FVkVSOjUxMixMRVNTOjUxMyxFUVVBTDo1MTQsTEVRVUFMOjUxNSxHUkVBVEVSOjUxNixOT1RFUVVBTDo1MTcsR0VRVUFMOjUxOCxBTFdBWVM6NTE5LEtFRVA6NzY4MCxSRVBMQUNFOjc2ODEsSU5DUjo3NjgyLERFQ1I6NzY4MyxJTlZFUlQ6NTM4NixJTkNSX1dSQVA6MzQwNTUsREVDUl9XUkFQOjM0MDU2LFZFTkRPUjo3OTM2LFJFTkRFUkVSOjc5MzcsVkVSU0lPTjo3OTM4LE5FQVJFU1Q6OTcyOCxMSU5FQVI6OTcyOSxORUFSRVNUX01JUE1BUF9ORUFSRVNUOjk5ODQsTElORUFSX01JUE1BUF9ORUFSRVNUOjk5ODUsTkVBUkVTVF9NSVBNQVBfTElORUFSOjk5ODYsTElORUFSX01JUE1BUF9MSU5FQVI6OTk4NyxURVhUVVJFX01BR19GSUxURVI6MTAyNDAsVEVYVFVSRV9NSU5fRklMVEVSOjEwMjQxLFRFWFRVUkVfV1JBUF9TOjEwMjQyLFRFWFRVUkVfV1JBUF9UOjEwMjQzLFRFWFRVUkVfMkQ6MzU1MyxURVhUVVJFOjU4OTAsVEVYVFVSRV9DVUJFX01BUDozNDA2NyxURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6MzQwNjgsVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOjM0MDY5LFRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDozNDA3MCxURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1k6MzQwNzEsVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZOjM0MDcyLFRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjozNDA3MyxURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6MzQwNzQsTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRTozNDA3NixURVhUVVJFMDozMzk4NCxURVhUVVJFMTozMzk4NSxURVhUVVJFMjozMzk4NixURVhUVVJFMzozMzk4NyxURVhUVVJFNDozMzk4OCxURVhUVVJFNTozMzk4OSxURVhUVVJFNjozMzk5MCxURVhUVVJFNzozMzk5MSxURVhUVVJFODozMzk5MixURVhUVVJFOTozMzk5MyxURVhUVVJFMTA6MzM5OTQsVEVYVFVSRTExOjMzOTk1LFRFWFRVUkUxMjozMzk5NixURVhUVVJFMTM6MzM5OTcsVEVYVFVSRTE0OjMzOTk4LFRFWFRVUkUxNTozMzk5OSxURVhUVVJFMTY6MzRlMyxURVhUVVJFMTc6MzQwMDEsVEVYVFVSRTE4OjM0MDAyLFRFWFRVUkUxOTozNDAwMyxURVhUVVJFMjA6MzQwMDQsVEVYVFVSRTIxOjM0MDA1LFRFWFRVUkUyMjozNDAwNixURVhUVVJFMjM6MzQwMDcsVEVYVFVSRTI0OjM0MDA4LFRFWFRVUkUyNTozNDAwOSxURVhUVVJFMjY6MzQwMTAsVEVYVFVSRTI3OjM0MDExLFRFWFRVUkUyODozNDAxMixURVhUVVJFMjk6MzQwMTMsVEVYVFVSRTMwOjM0MDE0LFRFWFRVUkUzMTozNDAxNSxBQ1RJVkVfVEVYVFVSRTozNDAxNixSRVBFQVQ6MTA0OTcsQ0xBTVBfVE9fRURHRTozMzA3MSxNSVJST1JFRF9SRVBFQVQ6MzM2NDgsRkxPQVRfVkVDMjozNTY2NCxGTE9BVF9WRUMzOjM1NjY1LEZMT0FUX1ZFQzQ6MzU2NjYsSU5UX1ZFQzI6MzU2NjcsSU5UX1ZFQzM6MzU2NjgsSU5UX1ZFQzQ6MzU2NjksQk9PTDozNTY3MCxCT09MX1ZFQzI6MzU2NzEsQk9PTF9WRUMzOjM1NjcyLEJPT0xfVkVDNDozNTY3MyxGTE9BVF9NQVQyOjM1Njc0LEZMT0FUX01BVDM6MzU2NzUsRkxPQVRfTUFUNDozNTY3NixTQU1QTEVSXzJEOjM1Njc4LFNBTVBMRVJfQ1VCRTozNTY4MCxWRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQ6MzQzMzgsVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOjM0MzM5LFZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFOjM0MzQwLFZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRTozNDM0MSxWRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQ6MzQ5MjIsVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSOjM0MzczLFZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc6MzQ5NzUsSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOjM1NzM4LElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUOjM1NzM5LENPTVBJTEVfU1RBVFVTOjM1NzEzLExPV19GTE9BVDozNjMzNixNRURJVU1fRkxPQVQ6MzYzMzcsSElHSF9GTE9BVDozNjMzOCxMT1dfSU5UOjM2MzM5LE1FRElVTV9JTlQ6MzYzNDAsSElHSF9JTlQ6MzYzNDEsRlJBTUVCVUZGRVI6MzYxNjAsUkVOREVSQlVGRkVSOjM2MTYxLFJHQkE0OjMyODU0LFJHQjVfQTE6MzI4NTUsUkdCNTY1OjM2MTk0LERFUFRIX0NPTVBPTkVOVDE2OjMzMTg5LFNURU5DSUxfSU5ERVg6NjQwMSxTVEVOQ0lMX0lOREVYODozNjE2OCxERVBUSF9TVEVOQ0lMOjM0MDQxLFJFTkRFUkJVRkZFUl9XSURUSDozNjE2MixSRU5ERVJCVUZGRVJfSEVJR0hUOjM2MTYzLFJFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQ6MzYxNjQsUkVOREVSQlVGRkVSX1JFRF9TSVpFOjM2MTc2LFJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFOjM2MTc3LFJFTkRFUkJVRkZFUl9CTFVFX1NJWkU6MzYxNzgsUkVOREVSQlVGRkVSX0FMUEhBX1NJWkU6MzYxNzksUkVOREVSQlVGRkVSX0RFUFRIX1NJWkU6MzYxODAsUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRTozNjE4MSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOjM2MDQ4LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUU6MzYwNDksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMOjM2MDUwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOjM2MDUxLENPTE9SX0FUVEFDSE1FTlQwOjM2MDY0LERFUFRIX0FUVEFDSE1FTlQ6MzYwOTYsU1RFTkNJTF9BVFRBQ0hNRU5UOjM2MTI4LERFUFRIX1NURU5DSUxfQVRUQUNITUVOVDozMzMwNixOT05FOjAsRlJBTUVCVUZGRVJfQ09NUExFVEU6MzYwNTMsRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOjM2MDU0LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UOjM2MDU1LEZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUzozNjA1NyxGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDozNjA2MSxGUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFTkRFUkJVRkZFUl9CSU5ESU5HOjM2MDA3LE1BWF9SRU5ERVJCVUZGRVJfU0laRTozNDAyNCxJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjoxMjg2LFVOUEFDS19GTElQX1lfV0VCR0w6Mzc0NDAsVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMOjM3NDQxLENPTlRFWFRfTE9TVF9XRUJHTDozNzQ0MixVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMOjM3NDQzLEJST1dTRVJfREVGQVVMVF9XRUJHTDozNzQ0NCxDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOjMzNzc2LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOjMzNzc3LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOjMzNzc4LENPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUOjMzNzc5LENPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc6MzU4NDAsQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRzozNTg0MSxDT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzozNTg0MixDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRzozNTg0MyxDT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfV0VCR0w6Mzc4MDgsQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDozNjE5NixDT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STTozNjQ5MixIQUxGX0ZMT0FUX09FUzozNjE5MyxET1VCTEU6NTEzMCxSRUFEX0JVRkZFUjozMDc0LFVOUEFDS19ST1dfTEVOR1RIOjMzMTQsVU5QQUNLX1NLSVBfUk9XUzozMzE1LFVOUEFDS19TS0lQX1BJWEVMUzozMzE2LFBBQ0tfUk9XX0xFTkdUSDozMzMwLFBBQ0tfU0tJUF9ST1dTOjMzMzEsUEFDS19TS0lQX1BJWEVMUzozMzMyLENPTE9SOjYxNDQsREVQVEg6NjE0NSxTVEVOQ0lMOjYxNDYsUkVEOjY0MDMsUkdCODozMjg0OSxSR0JBODozMjg1NixSR0IxMF9BMjozMjg1NyxURVhUVVJFX0JJTkRJTkdfM0Q6MzI4NzQsVU5QQUNLX1NLSVBfSU1BR0VTOjMyODc3LFVOUEFDS19JTUFHRV9IRUlHSFQ6MzI4NzgsVEVYVFVSRV8zRDozMjg3OSxURVhUVVJFX1dSQVBfUjozMjg4MixNQVhfM0RfVEVYVFVSRV9TSVpFOjMyODgzLFVOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVjozMzY0MCxNQVhfRUxFTUVOVFNfVkVSVElDRVM6MzNlMyxNQVhfRUxFTUVOVFNfSU5ESUNFUzozMzAwMSxURVhUVVJFX01JTl9MT0Q6MzMwODIsVEVYVFVSRV9NQVhfTE9EOjMzMDgzLFRFWFRVUkVfQkFTRV9MRVZFTDozMzA4NCxURVhUVVJFX01BWF9MRVZFTDozMzA4NSxNSU46MzI3NzUsTUFYOjMyNzc2LERFUFRIX0NPTVBPTkVOVDI0OjMzMTkwLE1BWF9URVhUVVJFX0xPRF9CSUFTOjM0MDQ1LFRFWFRVUkVfQ09NUEFSRV9NT0RFOjM0ODkyLFRFWFRVUkVfQ09NUEFSRV9GVU5DOjM0ODkzLENVUlJFTlRfUVVFUlk6MzQ5MTcsUVVFUllfUkVTVUxUOjM0OTE4LFFVRVJZX1JFU1VMVF9BVkFJTEFCTEU6MzQ5MTksU1RSRUFNX1JFQUQ6MzUwNDEsU1RSRUFNX0NPUFk6MzUwNDIsU1RBVElDX1JFQUQ6MzUwNDUsU1RBVElDX0NPUFk6MzUwNDYsRFlOQU1JQ19SRUFEOjM1MDQ5LERZTkFNSUNfQ09QWTozNTA1MCxNQVhfRFJBV19CVUZGRVJTOjM0ODUyLERSQVdfQlVGRkVSMDozNDg1MyxEUkFXX0JVRkZFUjE6MzQ4NTQsRFJBV19CVUZGRVIyOjM0ODU1LERSQVdfQlVGRkVSMzozNDg1NixEUkFXX0JVRkZFUjQ6MzQ4NTcsRFJBV19CVUZGRVI1OjM0ODU4LERSQVdfQlVGRkVSNjozNDg1OSxEUkFXX0JVRkZFUjc6MzQ4NjAsRFJBV19CVUZGRVI4OjM0ODYxLERSQVdfQlVGRkVSOTozNDg2MixEUkFXX0JVRkZFUjEwOjM0ODYzLERSQVdfQlVGRkVSMTE6MzQ4NjQsRFJBV19CVUZGRVIxMjozNDg2NSxEUkFXX0JVRkZFUjEzOjM0ODY2LERSQVdfQlVGRkVSMTQ6MzQ4NjcsRFJBV19CVUZGRVIxNTozNDg2OCxNQVhfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTOjM1NjU3LE1BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTOjM1NjU4LFNBTVBMRVJfM0Q6MzU2NzksU0FNUExFUl8yRF9TSEFET1c6MzU2ODIsRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVDozNTcyMyxQSVhFTF9QQUNLX0JVRkZFUjozNTA1MSxQSVhFTF9VTlBBQ0tfQlVGRkVSOjM1MDUyLFBJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkc6MzUwNTMsUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HOjM1MDU1LEZMT0FUX01BVDJ4MzozNTY4NSxGTE9BVF9NQVQyeDQ6MzU2ODYsRkxPQVRfTUFUM3gyOjM1Njg3LEZMT0FUX01BVDN4NDozNTY4OCxGTE9BVF9NQVQ0eDI6MzU2ODksRkxPQVRfTUFUNHgzOjM1NjkwLFNSR0I6MzU5MDQsU1JHQjg6MzU5MDUsU1JHQjhfQUxQSEE4OjM1OTA3LENPTVBBUkVfUkVGX1RPX1RFWFRVUkU6MzQ4OTQsUkdCQTMyRjozNDgzNixSR0IzMkY6MzQ4MzcsUkdCQTE2RjozNDg0MixSR0IxNkY6MzQ4NDMsVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSOjM1MDY5LE1BWF9BUlJBWV9URVhUVVJFX0xBWUVSUzozNTA3MSxNSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQ6MzUwNzYsTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUOjM1MDc3LE1BWF9WQVJZSU5HX0NPTVBPTkVOVFM6MzU2NTksVEVYVFVSRV8yRF9BUlJBWTozNTg2NixURVhUVVJFX0JJTkRJTkdfMkRfQVJSQVk6MzU4NjksUjExRl9HMTFGX0IxMEY6MzU4OTgsVU5TSUdORURfSU5UXzEwRl8xMUZfMTFGX1JFVjozNTg5OSxSR0I5X0U1OjM1OTAxLFVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjozNTkwMixUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREU6MzU5NjcsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTOjM1OTY4LFRSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HUzozNTk3MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUOjM1OTcyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRTozNTk3MyxUUkFOU0ZPUk1fRkVFREJBQ0tfUFJJTUlUSVZFU19XUklUVEVOOjM1OTc2LFJBU1RFUklaRVJfRElTQ0FSRDozNTk3NyxNQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFM6MzU5NzgsTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9BVFRSSUJTOjM1OTc5LElOVEVSTEVBVkVEX0FUVFJJQlM6MzU5ODAsU0VQQVJBVEVfQVRUUklCUzozNTk4MSxUUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSOjM1OTgyLFRSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElORzozNTk4MyxSR0JBMzJVSTozNjIwOCxSR0IzMlVJOjM2MjA5LFJHQkExNlVJOjM2MjE0LFJHQjE2VUk6MzYyMTUsUkdCQThVSTozNjIyMCxSR0I4VUk6MzYyMjEsUkdCQTMySTozNjIyNixSR0IzMkk6MzYyMjcsUkdCQTE2STozNjIzMixSR0IxNkk6MzYyMzMsUkdCQThJOjM2MjM4LFJHQjhJOjM2MjM5LFJFRF9JTlRFR0VSOjM2MjQ0LFJHQl9JTlRFR0VSOjM2MjQ4LFJHQkFfSU5URUdFUjozNjI0OSxTQU1QTEVSXzJEX0FSUkFZOjM2Mjg5LFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XOjM2MjkyLFNBTVBMRVJfQ1VCRV9TSEFET1c6MzYyOTMsVU5TSUdORURfSU5UX1ZFQzI6MzYyOTQsVU5TSUdORURfSU5UX1ZFQzM6MzYyOTUsVU5TSUdORURfSU5UX1ZFQzQ6MzYyOTYsSU5UX1NBTVBMRVJfMkQ6MzYyOTgsSU5UX1NBTVBMRVJfM0Q6MzYyOTksSU5UX1NBTVBMRVJfQ1VCRTozNjMwMCxJTlRfU0FNUExFUl8yRF9BUlJBWTozNjMwMyxVTlNJR05FRF9JTlRfU0FNUExFUl8yRDozNjMwNixVTlNJR05FRF9JTlRfU0FNUExFUl8zRDozNjMwNyxVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFOjM2MzA4LFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZOjM2MzExLERFUFRIX0NPTVBPTkVOVDMyRjozNjAxMixERVBUSDMyRl9TVEVOQ0lMODozNjAxMyxGTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVY6MzYyNjksRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORzozMzI5NixGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFOjMzMjk3LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkU6MzMyOTgsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFOjMzMjk5LEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQkxVRV9TSVpFOjMzMzAwLEZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRTozMzMwMSxGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkU6MzMzMDIsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9TVEVOQ0lMX1NJWkU6MzMzMDMsRlJBTUVCVUZGRVJfREVGQVVMVDozMzMwNCxVTlNJR05FRF9JTlRfMjRfODozNDA0MixERVBUSDI0X1NURU5DSUw4OjM1MDU2LFVOU0lHTkVEX05PUk1BTElaRUQ6MzU4NjMsRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HOjM2MDA2LFJFQURfRlJBTUVCVUZGRVI6MzYwMDgsRFJBV19GUkFNRUJVRkZFUjozNjAwOSxSRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkc6MzYwMTAsUkVOREVSQlVGRkVSX1NBTVBMRVM6MzYwMTEsRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSOjM2MDUyLE1BWF9DT0xPUl9BVFRBQ0hNRU5UUzozNjA2MyxDT0xPUl9BVFRBQ0hNRU5UMTozNjA2NSxDT0xPUl9BVFRBQ0hNRU5UMjozNjA2NixDT0xPUl9BVFRBQ0hNRU5UMzozNjA2NyxDT0xPUl9BVFRBQ0hNRU5UNDozNjA2OCxDT0xPUl9BVFRBQ0hNRU5UNTozNjA2OSxDT0xPUl9BVFRBQ0hNRU5UNjozNjA3MCxDT0xPUl9BVFRBQ0hNRU5UNzozNjA3MSxDT0xPUl9BVFRBQ0hNRU5UODozNjA3MixDT0xPUl9BVFRBQ0hNRU5UOTozNjA3MyxDT0xPUl9BVFRBQ0hNRU5UMTA6MzYwNzQsQ09MT1JfQVRUQUNITUVOVDExOjM2MDc1LENPTE9SX0FUVEFDSE1FTlQxMjozNjA3NixDT0xPUl9BVFRBQ0hNRU5UMTM6MzYwNzcsQ09MT1JfQVRUQUNITUVOVDE0OjM2MDc4LENPTE9SX0FUVEFDSE1FTlQxNTozNjA3OSxGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFOjM2MTgyLE1BWF9TQU1QTEVTOjM2MTgzLEhBTEZfRkxPQVQ6NTEzMSxSRzozMzMxOSxSR19JTlRFR0VSOjMzMzIwLFI4OjMzMzIxLFJHODozMzMyMyxSMTZGOjMzMzI1LFIzMkY6MzMzMjYsUkcxNkY6MzMzMjcsUkczMkY6MzMzMjgsUjhJOjMzMzI5LFI4VUk6MzMzMzAsUjE2STozMzMzMSxSMTZVSTozMzMzMixSMzJJOjMzMzMzLFIzMlVJOjMzMzM0LFJHOEk6MzMzMzUsUkc4VUk6MzMzMzYsUkcxNkk6MzMzMzcsUkcxNlVJOjMzMzM4LFJHMzJJOjMzMzM5LFJHMzJVSTozMzM0MCxWRVJURVhfQVJSQVlfQklORElORzozNDIyOSxSOF9TTk9STTozNjc1NixSRzhfU05PUk06MzY3NTcsUkdCOF9TTk9STTozNjc1OCxSR0JBOF9TTk9STTozNjc1OSxTSUdORURfTk9STUFMSVpFRDozNjc2NCxDT1BZX1JFQURfQlVGRkVSOjM2NjYyLENPUFlfV1JJVEVfQlVGRkVSOjM2NjYzLENPUFlfUkVBRF9CVUZGRVJfQklORElORzozNjY2MixDT1BZX1dSSVRFX0JVRkZFUl9CSU5ESU5HOjM2NjYzLFVOSUZPUk1fQlVGRkVSOjM1MzQ1LFVOSUZPUk1fQlVGRkVSX0JJTkRJTkc6MzUzNjgsVU5JRk9STV9CVUZGRVJfU1RBUlQ6MzUzNjksVU5JRk9STV9CVUZGRVJfU0laRTozNTM3MCxNQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTOjM1MzcxLE1BWF9GUkFHTUVOVF9VTklGT1JNX0JMT0NLUzozNTM3MyxNQVhfQ09NQklORURfVU5JRk9STV9CTE9DS1M6MzUzNzQsTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTOjM1Mzc1LE1BWF9VTklGT1JNX0JMT0NLX1NJWkU6MzUzNzYsTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFM6MzUzNzcsTUFYX0NPTUJJTkVEX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUzozNTM3OSxVTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UOjM1MzgwLEFDVElWRV9VTklGT1JNX0JMT0NLUzozNTM4MixVTklGT1JNX1RZUEU6MzUzODMsVU5JRk9STV9TSVpFOjM1Mzg0LFVOSUZPUk1fQkxPQ0tfSU5ERVg6MzUzODYsVU5JRk9STV9PRkZTRVQ6MzUzODcsVU5JRk9STV9BUlJBWV9TVFJJREU6MzUzODgsVU5JRk9STV9NQVRSSVhfU1RSSURFOjM1Mzg5LFVOSUZPUk1fSVNfUk9XX01BSk9SOjM1MzkwLFVOSUZPUk1fQkxPQ0tfQklORElORzozNTM5MSxVTklGT1JNX0JMT0NLX0RBVEFfU0laRTozNTM5MixVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNUzozNTM5NCxVTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVM6MzUzOTUsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX1ZFUlRFWF9TSEFERVI6MzUzOTYsVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUjozNTM5OCxJTlZBTElEX0lOREVYOjQyOTQ5NjcyOTUsTUFYX1ZFUlRFWF9PVVRQVVRfQ09NUE9ORU5UUzozNzE1NCxNQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUzozNzE1NyxNQVhfU0VSVkVSX1dBSVRfVElNRU9VVDozNzEzNyxPQkpFQ1RfVFlQRTozNzEzOCxTWU5DX0NPTkRJVElPTjozNzEzOSxTWU5DX1NUQVRVUzozNzE0MCxTWU5DX0ZMQUdTOjM3MTQxLFNZTkNfRkVOQ0U6MzcxNDIsU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEU6MzcxNDMsVU5TSUdOQUxFRDozNzE0NCxTSUdOQUxFRDozNzE0NSxBTFJFQURZX1NJR05BTEVEOjM3MTQ2LFRJTUVPVVRfRVhQSVJFRDozNzE0NyxDT05ESVRJT05fU0FUSVNGSUVEOjM3MTQ4LFdBSVRfRkFJTEVEOjM3MTQ5LFNZTkNfRkxVU0hfQ09NTUFORFNfQklUOjEsVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SOjM1MDcwLEFOWV9TQU1QTEVTX1BBU1NFRDozNTg4NyxBTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFOjM2MjAyLFNBTVBMRVJfQklORElORzozNTA5NyxSR0IxMF9BMlVJOjM2OTc1LElOVF8yXzEwXzEwXzEwX1JFVjozNjI1NSxUUkFOU0ZPUk1fRkVFREJBQ0s6MzYzODYsVFJBTlNGT1JNX0ZFRURCQUNLX1BBVVNFRDozNjM4NyxUUkFOU0ZPUk1fRkVFREJBQ0tfQUNUSVZFOjM2Mzg4LFRSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HOjM2Mzg5LENPTVBSRVNTRURfUjExX0VBQzozNzQ4OCxDT01QUkVTU0VEX1NJR05FRF9SMTFfRUFDOjM3NDg5LENPTVBSRVNTRURfUkcxMV9FQUM6Mzc0OTAsQ09NUFJFU1NFRF9TSUdORURfUkcxMV9FQUM6Mzc0OTEsQ09NUFJFU1NFRF9SR0I4X0VUQzI6Mzc0OTIsQ09NUFJFU1NFRF9TUkdCOF9FVEMyOjM3NDkzLENPTVBSRVNTRURfUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTQsQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzI6Mzc0OTUsQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzozNzQ5NixDT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQzozNzQ5NyxURVhUVVJFX0lNTVVUQUJMRV9GT1JNQVQ6MzcxNjcsTUFYX0VMRU1FTlRfSU5ERVg6MzYyMDMsVEVYVFVSRV9JTU1VVEFCTEVfTEVWRUxTOjMzNTAzLE1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDozNDA0N30pO2NvbnN0IHRuPXtDTE9DS1dJU0U6Z3IuQ1csQ09VTlRFUl9DTE9DS1dJU0U6Z3IuQ0NXfTt0bi52YWxpZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRuLkNMT0NLV0lTRXx8dD09PXRuLkNPVU5URVJfQ0xPQ0tXSVNFfTt2YXIgbW49T2JqZWN0LmZyZWV6ZSh0bik7ZnVuY3Rpb24geHQodCl7dGhpcy5fZWxsaXBzb2lkPUkodCxqLldHUzg0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc31PYmplY3QuZGVmaW5lUHJvcGVydGllcyh4dC5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19fSkseHQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZT1mdW5jdGlvbih0KXtyZXR1cm4gUi5QSV9PVkVSX1RXTy0yKk1hdGguYXRhbihNYXRoLmV4cCgtdCkpfSx4dC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlPWZ1bmN0aW9uKHQpe3Q+eHQuTWF4aW11bUxhdGl0dWRlP3Q9eHQuTWF4aW11bUxhdGl0dWRlOnQ8LXh0Lk1heGltdW1MYXRpdHVkZSYmKHQ9LXh0Lk1heGltdW1MYXRpdHVkZSk7Y29uc3QgZT1NYXRoLnNpbih0KTtyZXR1cm4gLjUqTWF0aC5sb2coKDErZSkvKDEtZSkpfSx4dC5NYXhpbXVtTGF0aXR1ZGU9eHQubWVyY2F0b3JBbmdsZVRvR2VvZGV0aWNMYXRpdHVkZShNYXRoLlBJKSx4dC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxyPXQubG9uZ2l0dWRlKm4saT14dC5nZW9kZXRpY0xhdGl0dWRlVG9NZXJjYXRvckFuZ2xlKHQubGF0aXR1ZGUpKm4sbz10LmhlaWdodDtyZXR1cm4gcChlKT8oZS54PXIsZS55PWksZS56PW8sZSk6bmV3IGwocixpLG8pfSx4dC5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQsZSl7aWYoIXAodCkpdGhyb3cgbmV3IGcoImNhcnRlc2lhbiBpcyByZXF1aXJlZCIpO2NvbnN0IG49dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMscj10LngqbixpPXh0Lm1lcmNhdG9yQW5nbGVUb0dlb2RldGljTGF0aXR1ZGUodC55Km4pLG89dC56O3JldHVybiBwKGUpPyhlLmxvbmdpdHVkZT1yLGUubGF0aXR1ZGU9aSxlLmhlaWdodD1vLGUpOm5ldyB6KHIsaSxvKX07ZnVuY3Rpb24gS3QodCl7aWYodD1JKHQsSS5FTVBUWV9PQkpFQ1QpLHRoaXMuX2VsbGlwc29pZD1JKHQuZWxsaXBzb2lkLGouV0dTODQpLHRoaXMuX251bWJlck9mTGV2ZWxaZXJvVGlsZXNYPUkodC5udW1iZXJPZkxldmVsWmVyb1RpbGVzWCwxKSx0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWT1JKHQubnVtYmVyT2ZMZXZlbFplcm9UaWxlc1ksMSksdGhpcy5fcHJvamVjdGlvbj1uZXcgeHQodGhpcy5fZWxsaXBzb2lkKSxwKHQucmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMpJiZwKHQucmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMpKXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzPXQucmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMsdGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnM9dC5yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycztlbHNle2NvbnN0IHI9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMqTWF0aC5QSTt0aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycz1uZXcgeCgtciwtciksdGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnM9bmV3IHgocixyKX1jb25zdCBlPXRoaXMuX3Byb2plY3Rpb24udW5wcm9qZWN0KHRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzKSxuPXRoaXMuX3Byb2plY3Rpb24udW5wcm9qZWN0KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzKTt0aGlzLl9yZWN0YW5nbGU9bmV3IE4oZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxuLmxvbmdpdHVkZSxuLmxhdGl0dWRlKX1PYmplY3QuZGVmaW5lUHJvcGVydGllcyhLdC5wcm90b3R5cGUse2VsbGlwc29pZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsbGlwc29pZH19LHJlY3RhbmdsZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlY3RhbmdsZX19LHByb2plY3Rpb246e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9qZWN0aW9ufX19KSxLdC5wcm90b3R5cGUuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9udW1iZXJPZkxldmVsWmVyb1RpbGVzWDw8dH0sS3QucHJvdG90eXBlLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbnVtYmVyT2ZMZXZlbFplcm9UaWxlc1k8PHR9LEt0LnByb3RvdHlwZS5yZWN0YW5nbGVUb05hdGl2ZVJlY3RhbmdsZT1mdW5jdGlvbih0LGUpe2NvbnN0IG49dGhpcy5fcHJvamVjdGlvbixyPW4ucHJvamVjdChOLnNvdXRod2VzdCh0KSksaT1uLnByb2plY3QoTi5ub3J0aGVhc3QodCkpO3JldHVybiBwKGUpPyhlLndlc3Q9ci54LGUuc291dGg9ci55LGUuZWFzdD1pLngsZS5ub3J0aD1pLnksZSk6bmV3IE4oci54LHIueSxpLngsaS55KX0sS3QucHJvdG90eXBlLnRpbGVYWVRvTmF0aXZlUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dGhpcy5nZXROdW1iZXJPZlhUaWxlc0F0TGV2ZWwobiksbz10aGlzLmdldE51bWJlck9mWVRpbGVzQXRMZXZlbChuKSxzPSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy54LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngpL2ksaD10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54K3QqcyxhPXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLngrKHQrMSkqcyxmPSh0aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LXRoaXMuX3JlY3RhbmdsZVNvdXRod2VzdEluTWV0ZXJzLnkpL28sZD10aGlzLl9yZWN0YW5nbGVOb3J0aGVhc3RJbk1ldGVycy55LWUqZixfPXRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktKGUrMSkqZjtyZXR1cm4gcChyKT8oci53ZXN0PWgsci5zb3V0aD1fLHIuZWFzdD1hLHIubm9ydGg9ZCxyKTpuZXcgTihoLF8sYSxkKX0sS3QucHJvdG90eXBlLnRpbGVYWVRvUmVjdGFuZ2xlPWZ1bmN0aW9uKHQsZSxuLHIpe2NvbnN0IGk9dGhpcy50aWxlWFlUb05hdGl2ZVJlY3RhbmdsZSh0LGUsbixyKSxvPXRoaXMuX3Byb2plY3Rpb24scz1vLnVucHJvamVjdChuZXcgeChpLndlc3QsaS5zb3V0aCkpLGg9by51bnByb2plY3QobmV3IHgoaS5lYXN0LGkubm9ydGgpKTtyZXR1cm4gaS53ZXN0PXMubG9uZ2l0dWRlLGkuc291dGg9cy5sYXRpdHVkZSxpLmVhc3Q9aC5sb25naXR1ZGUsaS5ub3J0aD1oLmxhdGl0dWRlLGl9LEt0LnByb3RvdHlwZS5wb3NpdGlvblRvVGlsZVhZPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCByPXRoaXMuX3JlY3RhbmdsZTtpZighTi5jb250YWlucyhyLHQpKXJldHVybjtjb25zdCBpPXRoaXMuZ2V0TnVtYmVyT2ZYVGlsZXNBdExldmVsKGUpLG89dGhpcy5nZXROdW1iZXJPZllUaWxlc0F0TGV2ZWwoZSksaD0odGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueC10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54KS9pLGY9KHRoaXMuX3JlY3RhbmdsZU5vcnRoZWFzdEluTWV0ZXJzLnktdGhpcy5fcmVjdGFuZ2xlU291dGh3ZXN0SW5NZXRlcnMueSkvbyxfPXRoaXMuX3Byb2plY3Rpb24ucHJvamVjdCh0KSxTPV8ueC10aGlzLl9yZWN0YW5nbGVTb3V0aHdlc3RJbk1ldGVycy54LE89dGhpcy5fcmVjdGFuZ2xlTm9ydGhlYXN0SW5NZXRlcnMueS1fLnk7bGV0IHc9Uy9ofDA7dz49aSYmKHc9aS0xKTtsZXQgYj1PL2Z8MDtyZXR1cm4gYj49byYmKGI9by0xKSxwKG4pPyhuLng9dyxuLnk9YixuKTpuZXcgeCh3LGIpfTtmdW5jdGlvbiBTbigpe3RoaXMubmFtZT12b2lkIDAsdGhpcy5kZXNjcmlwdGlvbj12b2lkIDAsdGhpcy5wb3NpdGlvbj12b2lkIDAsdGhpcy5kYXRhPXZvaWQgMCx0aGlzLmltYWdlcnlMYXllcj12b2lkIDB9U24ucHJvdG90eXBlLmNvbmZpZ3VyZU5hbWVGcm9tUHJvcGVydGllcz1mdW5jdGlvbih0KXtsZXQgZT0xMCxuO2Zvcihjb25zdCByIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmdFtyXSl7Y29uc3QgaT1yLnRvTG93ZXJDYXNlKCk7ZT4xJiZpPT09Im5hbWUiPyhlPTEsbj1yKTplPjImJmk9PT0idGl0bGUiPyhlPTIsbj1yKTplPjMmJi9uYW1lL2kudGVzdChyKT8oZT0zLG49cik6ZT40JiYvdGl0bGUvaS50ZXN0KHIpJiYoZT00LG49cil9cChuKSYmKHRoaXMubmFtZT10W25dKX0sU24ucHJvdG90eXBlLmNvbmZpZ3VyZURlc2NyaXB0aW9uRnJvbVByb3BlcnRpZXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXtsZXQgcj0nPHRhYmxlIGNsYXNzPSJjZXNpdW0taW5mb0JveC1kZWZhdWx0VGFibGUiPic7Zm9yKGNvbnN0IGkgaW4gbilpZihuLmhhc093blByb3BlcnR5KGkpKXtjb25zdCBvPW5baV07cChvKSYmKHR5cGVvZiBvPT0ib2JqZWN0Ij9yKz1gPHRyPjx0ZD4ke2l9PC90ZD48dGQ+JHtlKG8pfTwvdGQ+PC90cj5gOnIrPWA8dHI+PHRkPiR7aX08L3RkPjx0ZD4ke299PC90ZD48L3RyPmApfXJldHVybiByKz0iPC90YWJsZT4iLHJ9dGhpcy5kZXNjcmlwdGlvbj1lKHQpfTt2YXIgZW49eGU7ZnVuY3Rpb24geGUodCxlKXt0aGlzLng9dCx0aGlzLnk9ZX14ZS5wcm90b3R5cGU9e2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4ZSh0aGlzLngsdGhpcy55KX0sYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2FkZCh0KX0sc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3N1Yih0KX0sbXVsdEJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdEJ5UG9pbnQodCl9LGRpdkJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludCh0KX0sbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KHQpfSxkaXY6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KHQpfSxyb3RhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKHQpfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQodCxlKX0sbWF0TXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpfSx1bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpfSxwZXJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LG1hZzpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sZXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX0sZGlzdDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcih0KSl9LGRpc3RTcXI6ZnVuY3Rpb24odCl7dmFyIGU9dC54LXRoaXMueCxuPXQueS10aGlzLnk7cmV0dXJuIGUqZStuKm59LGFuZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LHRoaXMueCl9LGFuZ2xlVG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LXQueSx0aGlzLngtdC54KX0sYW5nbGVXaXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuZ2xlV2l0aFNlcCh0LngsdC55KX0sYW5nbGVXaXRoU2VwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy54KmUtdGhpcy55KnQsdGhpcy54KnQrdGhpcy55KmUpfSxfbWF0TXVsdDpmdW5jdGlvbih0KXt2YXIgZT10WzBdKnRoaXMueCt0WzFdKnRoaXMueSxuPXRbMl0qdGhpcy54K3RbM10qdGhpcy55O3JldHVybiB0aGlzLng9ZSx0aGlzLnk9bix0aGlzfSxfYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfSxfc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfSxfbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxfZGl2OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngvPXQsdGhpcy55Lz10LHRoaXN9LF9tdWx0QnlQb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc30sX2RpdkJ5UG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9LF91bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycDpmdW5jdGlvbigpe3ZhciB0PXRoaXMueTtyZXR1cm4gdGhpcy55PXRoaXMueCx0aGlzLng9LXQsdGhpc30sX3JvdGF0ZTpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpLHI9ZSp0aGlzLngtbip0aGlzLnksaT1uKnRoaXMueCtlKnRoaXMueTtyZXR1cm4gdGhpcy54PXIsdGhpcy55PWksdGhpc30sX3JvdGF0ZUFyb3VuZDpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCksaT1lLngrbioodGhpcy54LWUueCktcioodGhpcy55LWUueSksbz1lLnkrcioodGhpcy54LWUueCkrbioodGhpcy55LWUueSk7cmV0dXJuIHRoaXMueD1pLHRoaXMueT1vLHRoaXN9LF9yb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc319LHhlLmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB4ZT90OkFycmF5LmlzQXJyYXkodCk/bmV3IHhlKHRbMF0sdFsxXSk6dH07dmFyIGJvPWVuLG1yPU9lO2Z1bmN0aW9uIE9lKHQsZSxuLHIsaSl7dGhpcy5wcm9wZXJ0aWVzPXt9LHRoaXMuZXh0ZW50PW4sdGhpcy50eXBlPTAsdGhpcy5fcGJmPXQsdGhpcy5fZ2VvbWV0cnk9LTEsdGhpcy5fa2V5cz1yLHRoaXMuX3ZhbHVlcz1pLHQucmVhZEZpZWxkcyhnbyx0aGlzLGUpfWZ1bmN0aW9uIGdvKHQsZSxuKXt0PT0xP2UuaWQ9bi5yZWFkVmFyaW50KCk6dD09Mj9tbyhuLGUpOnQ9PTM/ZS50eXBlPW4ucmVhZFZhcmludCgpOnQ9PTQmJihlLl9nZW9tZXRyeT1uLnBvcyl9ZnVuY3Rpb24gbW8odCxlKXtmb3IodmFyIG49dC5yZWFkVmFyaW50KCkrdC5wb3M7dC5wb3M8bjspe3ZhciByPWUuX2tleXNbdC5yZWFkVmFyaW50KCldLGk9ZS5fdmFsdWVzW3QucmVhZFZhcmludCgpXTtlLnByb3BlcnRpZXNbcl09aX19T2UudHlwZXM9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdLE9lLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wYmY7dC5wb3M9dGhpcy5fZ2VvbWV0cnk7Zm9yKHZhciBlPXQucmVhZFZhcmludCgpK3QucG9zLG49MSxyPTAsaT0wLG89MCxzPVtdLGg7dC5wb3M8ZTspe2lmKHI8PTApe3ZhciBhPXQucmVhZFZhcmludCgpO249YSY3LHI9YT4+M31pZihyLS0sbj09PTF8fG49PT0yKWkrPXQucmVhZFNWYXJpbnQoKSxvKz10LnJlYWRTVmFyaW50KCksbj09PTEmJihoJiZzLnB1c2goaCksaD1bXSksaC5wdXNoKG5ldyBibyhpLG8pKTtlbHNlIGlmKG49PT03KWgmJmgucHVzaChoWzBdLmNsb25lKCkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGNvbW1hbmQgIituKX1yZXR1cm4gaCYmcy5wdXNoKGgpLHN9LE9lLnByb3RvdHlwZS5iYm94PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGJmO3QucG9zPXRoaXMuX2dlb21ldHJ5O2Zvcih2YXIgZT10LnJlYWRWYXJpbnQoKSt0LnBvcyxuPTEscj0wLGk9MCxvPTAscz0xLzAsaD0tMS8wLGE9MS8wLGY9LTEvMDt0LnBvczxlOyl7aWYocjw9MCl7dmFyIGQ9dC5yZWFkVmFyaW50KCk7bj1kJjcscj1kPj4zfWlmKHItLSxuPT09MXx8bj09PTIpaSs9dC5yZWFkU1ZhcmludCgpLG8rPXQucmVhZFNWYXJpbnQoKSxpPHMmJihzPWkpLGk+aCYmKGg9aSksbzxhJiYoYT1vKSxvPmYmJihmPW8pO2Vsc2UgaWYobiE9PTcpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGNvbW1hbmQgIituKX1yZXR1cm5bcyxhLGgsZl19LE9lLnByb3RvdHlwZS50b0dlb0pTT049ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZXh0ZW50Kk1hdGgucG93KDIsbiksaT10aGlzLmV4dGVudCp0LG89dGhpcy5leHRlbnQqZSxzPXRoaXMubG9hZEdlb21ldHJ5KCksaD1PZS50eXBlc1t0aGlzLnR5cGVdLGEsZjtmdW5jdGlvbiBkKE8pe2Zvcih2YXIgdz0wO3c8Ty5sZW5ndGg7dysrKXt2YXIgYj1PW3ddLE09MTgwLShiLnkrbykqMzYwL3I7T1t3XT1bKGIueCtpKSozNjAvci0xODAsMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKE0qTWF0aC5QSS8xODApKS05MF19fXN3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgMTp2YXIgXz1bXTtmb3IoYT0wO2E8cy5sZW5ndGg7YSsrKV9bYV09c1thXVswXTtzPV8sZChzKTticmVhaztjYXNlIDI6Zm9yKGE9MDthPHMubGVuZ3RoO2ErKylkKHNbYV0pO2JyZWFrO2Nhc2UgMzpmb3Iocz1TbyhzKSxhPTA7YTxzLmxlbmd0aDthKyspZm9yKGY9MDtmPHNbYV0ubGVuZ3RoO2YrKylkKHNbYV1bZl0pO2JyZWFrfXMubGVuZ3RoPT09MT9zPXNbMF06aD0iTXVsdGkiK2g7dmFyIFM9e3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOmgsY29vcmRpbmF0ZXM6c30scHJvcGVydGllczp0aGlzLnByb3BlcnRpZXN9O3JldHVybiJpZCJpbiB0aGlzJiYoUy5pZD10aGlzLmlkKSxTfTtmdW5jdGlvbiBTbyh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD0xKXJldHVyblt0XTtmb3IodmFyIG49W10scixpLG89MDtvPGU7bysrKXt2YXIgcz13byh0W29dKTtzIT09MCYmKGk9PT12b2lkIDAmJihpPXM8MCksaT09PXM8MD8ociYmbi5wdXNoKHIpLHI9W3Rbb11dKTpyLnB1c2godFtvXSkpfXJldHVybiByJiZuLnB1c2gociksbn1mdW5jdGlvbiB3byh0KXtmb3IodmFyIGU9MCxuPTAscj10Lmxlbmd0aCxpPXItMSxvLHM7bjxyO2k9bisrKW89dFtuXSxzPXRbaV0sZSs9KHMueC1vLngpKihvLnkrcy55KTtyZXR1cm4gZX12YXIgSW89bXIsQ289U3I7ZnVuY3Rpb24gU3IodCxlKXt0aGlzLnZlcnNpb249MSx0aGlzLm5hbWU9bnVsbCx0aGlzLmV4dGVudD00MDk2LHRoaXMubGVuZ3RoPTAsdGhpcy5fcGJmPXQsdGhpcy5fa2V5cz1bXSx0aGlzLl92YWx1ZXM9W10sdGhpcy5fZmVhdHVyZXM9W10sdC5yZWFkRmllbGRzKE5vLHRoaXMsZSksdGhpcy5sZW5ndGg9dGhpcy5fZmVhdHVyZXMubGVuZ3RofWZ1bmN0aW9uIE5vKHQsZSxuKXt0PT09MTU/ZS52ZXJzaW9uPW4ucmVhZFZhcmludCgpOnQ9PT0xP2UubmFtZT1uLnJlYWRTdHJpbmcoKTp0PT09NT9lLmV4dGVudD1uLnJlYWRWYXJpbnQoKTp0PT09Mj9lLl9mZWF0dXJlcy5wdXNoKG4ucG9zKTp0PT09Mz9lLl9rZXlzLnB1c2gobi5yZWFkU3RyaW5nKCkpOnQ9PT00JiZlLl92YWx1ZXMucHVzaChNbyhuKSl9ZnVuY3Rpb24gTW8odCl7Zm9yKHZhciBlPW51bGwsbj10LnJlYWRWYXJpbnQoKSt0LnBvczt0LnBvczxuOyl7dmFyIHI9dC5yZWFkVmFyaW50KCk+PjM7ZT1yPT09MT90LnJlYWRTdHJpbmcoKTpyPT09Mj90LnJlYWRGbG9hdCgpOnI9PT0zP3QucmVhZERvdWJsZSgpOnI9PT00P3QucmVhZFZhcmludDY0KCk6cj09PTU/dC5yZWFkVmFyaW50KCk6cj09PTY/dC5yZWFkU1ZhcmludCgpOnI9PT03P3QucmVhZEJvb2xlYW4oKTpudWxsfXJldHVybiBlfVNyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5fZmVhdHVyZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzIik7dGhpcy5fcGJmLnBvcz10aGlzLl9mZWF0dXJlc1t0XTt2YXIgZT10aGlzLl9wYmYucmVhZFZhcmludCgpK3RoaXMuX3BiZi5wb3M7cmV0dXJuIG5ldyBJbyh0aGlzLl9wYmYsZSx0aGlzLmV4dGVudCx0aGlzLl9rZXlzLHRoaXMuX3ZhbHVlcyl9O3ZhciBGbz1DbyxMbz1QbztmdW5jdGlvbiBQbyh0LGUpe3RoaXMubGF5ZXJzPXQucmVhZEZpZWxkcyh2byx7fSxlKX1mdW5jdGlvbiB2byh0LGUsbil7aWYodD09PTMpe3ZhciByPW5ldyBGbyhuLG4ucmVhZFZhcmludCgpK24ucG9zKTtyLmxlbmd0aCYmKGVbci5uYW1lXT1yKX19dmFyIERvPUxvLFh0PW1yLHduPXt9Oy8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovd24ucmVhZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLHMsaD1pKjgtci0xLGE9KDE8PGgpLTEsZj1hPj4xLGQ9LTcsXz1uP2ktMTowLFM9bj8tMToxLE89dFtlK19dO2ZvcihfKz1TLG89TyYoMTw8LWQpLTEsTz4+PS1kLGQrPWg7ZD4wO289byoyNTYrdFtlK19dLF8rPVMsZC09OCk7Zm9yKHM9byYoMTw8LWQpLTEsbz4+PS1kLGQrPXI7ZD4wO3M9cyoyNTYrdFtlK19dLF8rPVMsZC09OCk7aWYobz09PTApbz0xLWY7ZWxzZXtpZihvPT09YSlyZXR1cm4gcz9OYU46KE8/LTE6MSkqKDEvMCk7cz1zK01hdGgucG93KDIsciksbz1vLWZ9cmV0dXJuKE8/LTE6MSkqcypNYXRoLnBvdygyLG8tcil9LHduLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgcyxoLGEsZj1vKjgtaS0xLGQ9KDE8PGYpLTEsXz1kPj4xLFM9aT09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxPPXI/MDpvLTEsdz1yPzE6LTEsYj1lPDB8fGU9PT0wJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGg9aXNOYU4oZSk/MTowLHM9ZCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSooYT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxhKj0yKSxzK18+PTE/ZSs9Uy9hOmUrPVMqTWF0aC5wb3coMiwxLV8pLGUqYT49MiYmKHMrKyxhLz0yKSxzK18+PWQ/KGg9MCxzPWQpOnMrXz49MT8oaD0oZSphLTEpKk1hdGgucG93KDIsaSkscz1zK18pOihoPWUqTWF0aC5wb3coMixfLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODt0W24rT109aCYyNTUsTys9dyxoLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxoLGYrPWk7Zj4wO3RbbitPXT1zJjI1NSxPKz13LHMvPTI1NixmLT04KTt0W24rTy13XXw9YioxMjh9O3ZhciBCbz1rLG5uPXduO2Z1bmN0aW9uIGsodCl7dGhpcy5idWY9QXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCk/dDpuZXcgVWludDhBcnJheSh0fHwwKSx0aGlzLnBvcz0wLHRoaXMudHlwZT0wLHRoaXMubGVuZ3RoPXRoaXMuYnVmLmxlbmd0aH1rLlZhcmludD0wLGsuRml4ZWQ2ND0xLGsuQnl0ZXM9MixrLkZpeGVkMzI9NTt2YXIgSW49KDE8PDE2KSooMTw8MTYpLHdyPTEvSW4sVW89MTIsSXI9dHlwZW9mIFRleHREZWNvZGVyPiJ1Ij9udWxsOm5ldyBUZXh0RGVjb2RlcigidXRmOCIpO2sucHJvdG90eXBlPXtkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5idWY9bnVsbH0scmVhZEZpZWxkczpmdW5jdGlvbih0LGUsbil7Zm9yKG49bnx8dGhpcy5sZW5ndGg7dGhpcy5wb3M8bjspe3ZhciByPXRoaXMucmVhZFZhcmludCgpLGk9cj4+MyxvPXRoaXMucG9zO3RoaXMudHlwZT1yJjcsdChpLGUsdGhpcyksdGhpcy5wb3M9PT1vJiZ0aGlzLnNraXAocil9cmV0dXJuIGV9LHJlYWRNZXNzYWdlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVhZEZpZWxkcyh0LGUsdGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MpfSxyZWFkRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PXJuKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZFNGaXhlZDMyOmZ1bmN0aW9uKCl7dmFyIHQ9TnIodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkRml4ZWQ2NDpmdW5jdGlvbigpe3ZhciB0PXJuKHRoaXMuYnVmLHRoaXMucG9zKStybih0aGlzLmJ1Zix0aGlzLnBvcys0KSpJbjtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFNGaXhlZDY0OmZ1bmN0aW9uKCl7dmFyIHQ9cm4odGhpcy5idWYsdGhpcy5wb3MpK05yKHRoaXMuYnVmLHRoaXMucG9zKzQpKkluO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkRmxvYXQ6ZnVuY3Rpb24oKXt2YXIgdD1ubi5yZWFkKHRoaXMuYnVmLHRoaXMucG9zLCEwLDIzLDQpO3JldHVybiB0aGlzLnBvcys9NCx0fSxyZWFkRG91YmxlOmZ1bmN0aW9uKCl7dmFyIHQ9bm4ucmVhZCh0aGlzLmJ1Zix0aGlzLnBvcywhMCw1Miw4KTtyZXR1cm4gdGhpcy5wb3MrPTgsdH0scmVhZFZhcmludDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJ1ZixuLHI7cmV0dXJuIHI9ZVt0aGlzLnBvcysrXSxuPXImMTI3LHI8MTI4fHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDcscjwxMjgpfHwocj1lW3RoaXMucG9zKytdLG58PShyJjEyNyk8PDE0LHI8MTI4KXx8KHI9ZVt0aGlzLnBvcysrXSxufD0ociYxMjcpPDwyMSxyPDEyOCk/bjoocj1lW3RoaXMucG9zXSxufD0ociYxNSk8PDI4LGpvKG4sdCx0aGlzKSl9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRWYXJpbnQoITApfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxlPXRoaXMucG9zO3JldHVybiB0aGlzLnBvcz10LHQtZT49VW8mJklyP0pvKHRoaXMuYnVmLGUsdCk6UW8odGhpcy5idWYsZSx0KX0scmVhZEJ5dGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsZT10aGlzLmJ1Zi5zdWJhcnJheSh0aGlzLnBvcyx0KTtyZXR1cm4gdGhpcy5wb3M9dCxlfSxyZWFkUGFja2VkVmFyaW50OmZ1bmN0aW9uKHQsZSl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFZhcmludChlKSk7dmFyIG49V3QodGhpcyk7Zm9yKHQ9dHx8W107dGhpcy5wb3M8bjspdC5wdXNoKHRoaXMucmVhZFZhcmludChlKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO3JldHVybiB0fSxyZWFkUGFja2VkQm9vbGVhbjpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1rLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZEZsb2F0OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRmxvYXQoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWREb3VibGU6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRG91YmxlKCkpO3JldHVybiB0fSxyZWFkUGFja2VkRml4ZWQzMjpmdW5jdGlvbih0KXtpZih0aGlzLnR5cGUhPT1rLkJ5dGVzKXJldHVybiB0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtyZXR1cm4gdH0scmVhZFBhY2tlZFNGaXhlZDMyOmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTt2YXIgZT1XdCh0aGlzKTtmb3IodD10fHxbXTt0aGlzLnBvczxlOyl0LnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7cmV0dXJuIHR9LHJlYWRQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZSE9PWsuQnl0ZXMpcmV0dXJuIHQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO3JldHVybiB0fSxyZWFkUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7aWYodGhpcy50eXBlIT09ay5CeXRlcylyZXR1cm4gdC5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3ZhciBlPVd0KHRoaXMpO2Zvcih0PXR8fFtdO3RoaXMucG9zPGU7KXQucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtyZXR1cm4gdH0sc2tpcDpmdW5jdGlvbih0KXt2YXIgZT10Jjc7aWYoZT09PWsuVmFyaW50KWZvcig7dGhpcy5idWZbdGhpcy5wb3MrK10+MTI3Oyk7ZWxzZSBpZihlPT09ay5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGU9PT1rLkZpeGVkMzIpdGhpcy5wb3MrPTQ7ZWxzZSBpZihlPT09ay5GaXhlZDY0KXRoaXMucG9zKz04O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmltcGxlbWVudGVkIHR5cGU6ICIrZSl9LHdyaXRlVGFnOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVZhcmludCh0PDwzfGUpfSxyZWFsbG9jOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmxlbmd0aHx8MTY7ZTx0aGlzLnBvcyt0OyllKj0yO2lmKGUhPT10aGlzLmxlbmd0aCl7dmFyIG49bmV3IFVpbnQ4QXJyYXkoZSk7bi5zZXQodGhpcy5idWYpLHRoaXMuYnVmPW4sdGhpcy5sZW5ndGg9ZX19LGZpbmlzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aD10aGlzLnBvcyx0aGlzLnBvcz0wLHRoaXMuYnVmLnN1YmFycmF5KDAsdGhpcy5sZW5ndGgpfSx3cml0ZUZpeGVkMzI6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDQpLFJlKHRoaXMuYnVmLHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZVNGaXhlZDMyOmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg0KSxSZSh0aGlzLmJ1Zix0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSxSZSh0aGlzLmJ1Zix0Ji0xLHRoaXMucG9zKSxSZSh0aGlzLmJ1ZixNYXRoLmZsb29yKHQqd3IpLHRoaXMucG9zKzQpLHRoaXMucG9zKz04fSx3cml0ZVNGaXhlZDY0OmZ1bmN0aW9uKHQpe3RoaXMucmVhbGxvYyg4KSxSZSh0aGlzLmJ1Zix0Ji0xLHRoaXMucG9zKSxSZSh0aGlzLmJ1ZixNYXRoLmZsb29yKHQqd3IpLHRoaXMucG9zKzQpLHRoaXMucG9zKz04fSx3cml0ZVZhcmludDpmdW5jdGlvbih0KXtpZih0PSt0fHwwLHQ+MjY4NDM1NDU1fHx0PDApe0dvKHQsdGhpcyk7cmV0dXJufXRoaXMucmVhbGxvYyg0KSx0aGlzLmJ1Zlt0aGlzLnBvcysrXT10JjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPSh0Pj4+PTcpJjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPSh0Pj4+PTcpJjEyN3wodD4xMjc/MTI4OjApLCEodDw9MTI3KSYmKHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyNykpKX0sd3JpdGVTVmFyaW50OmZ1bmN0aW9uKHQpe3RoaXMud3JpdGVWYXJpbnQodDwwPy10KjItMTp0KjIpfSx3cml0ZUJvb2xlYW46ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludChCb29sZWFuKHQpKX0sd3JpdGVTdHJpbmc6ZnVuY3Rpb24odCl7dD1TdHJpbmcodCksdGhpcy5yZWFsbG9jKHQubGVuZ3RoKjQpLHRoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dGhpcy5wb3M9dHModGhpcy5idWYsdCx0aGlzLnBvcyk7dmFyIG49dGhpcy5wb3MtZTtuPj0xMjgmJkNyKGUsbix0aGlzKSx0aGlzLnBvcz1lLTEsdGhpcy53cml0ZVZhcmludChuKSx0aGlzLnBvcys9bn0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksbm4ud3JpdGUodGhpcy5idWYsdCx0aGlzLnBvcywhMCwyMyw0KSx0aGlzLnBvcys9NH0sd3JpdGVEb3VibGU6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLG5uLndyaXRlKHRoaXMuYnVmLHQsdGhpcy5wb3MsITAsNTIsOCksdGhpcy5wb3MrPTh9LHdyaXRlQnl0ZXM6ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7dGhpcy53cml0ZVZhcmludChlKSx0aGlzLnJlYWxsb2MoZSk7Zm9yKHZhciBuPTA7bjxlO24rKyl0aGlzLmJ1Zlt0aGlzLnBvcysrXT10W25dfSx3cml0ZVJhd01lc3NhZ2U6ZnVuY3Rpb24odCxlKXt0aGlzLnBvcysrO3ZhciBuPXRoaXMucG9zO3QoZSx0aGlzKTt2YXIgcj10aGlzLnBvcy1uO3I+PTEyOCYmQ3IobixyLHRoaXMpLHRoaXMucG9zPW4tMSx0aGlzLndyaXRlVmFyaW50KHIpLHRoaXMucG9zKz1yfSx3cml0ZU1lc3NhZ2U6ZnVuY3Rpb24odCxlLG4pe3RoaXMud3JpdGVUYWcodCxrLkJ5dGVzKSx0aGlzLndyaXRlUmF3TWVzc2FnZShlLG4pfSx3cml0ZVBhY2tlZFZhcmludDpmdW5jdGlvbih0LGUpe2UubGVuZ3RoJiZ0aGlzLndyaXRlTWVzc2FnZSh0LFZvLGUpfSx3cml0ZVBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxYbyxlKX0sd3JpdGVQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsSG8sZSl9LHdyaXRlUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxXbyxlKX0sd3JpdGVQYWNrZWREb3VibGU6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCx6byxlKX0sd3JpdGVQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQscW8sZSl9LHdyaXRlUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxLbyxlKX0sd3JpdGVQYWNrZWRGaXhlZDY0OmZ1bmN0aW9uKHQsZSl7ZS5sZW5ndGgmJnRoaXMud3JpdGVNZXNzYWdlKHQsWW8sZSl9LHdyaXRlUGFja2VkU0ZpeGVkNjQ6ZnVuY3Rpb24odCxlKXtlLmxlbmd0aCYmdGhpcy53cml0ZU1lc3NhZ2UodCxabyxlKX0sd3JpdGVCeXRlc0ZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuQnl0ZXMpLHRoaXMud3JpdGVCeXRlcyhlKX0sd3JpdGVGaXhlZDMyRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDMyKSx0aGlzLndyaXRlRml4ZWQzMihlKX0sd3JpdGVTRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuRml4ZWQzMiksdGhpcy53cml0ZVNGaXhlZDMyKGUpfSx3cml0ZUZpeGVkNjRGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxrLkZpeGVkNjQpLHRoaXMud3JpdGVGaXhlZDY0KGUpfSx3cml0ZVNGaXhlZDY0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDY0KSx0aGlzLndyaXRlU0ZpeGVkNjQoZSl9LHdyaXRlVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5WYXJpbnQpLHRoaXMud3JpdGVWYXJpbnQoZSl9LHdyaXRlU1ZhcmludEZpZWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy53cml0ZVRhZyh0LGsuVmFyaW50KSx0aGlzLndyaXRlU1ZhcmludChlKX0sd3JpdGVTdHJpbmdGaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVUYWcodCxrLkJ5dGVzKSx0aGlzLndyaXRlU3RyaW5nKGUpfSx3cml0ZUZsb2F0RmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDMyKSx0aGlzLndyaXRlRmxvYXQoZSl9LHdyaXRlRG91YmxlRmllbGQ6ZnVuY3Rpb24odCxlKXt0aGlzLndyaXRlVGFnKHQsay5GaXhlZDY0KSx0aGlzLndyaXRlRG91YmxlKGUpfSx3cml0ZUJvb2xlYW5GaWVsZDpmdW5jdGlvbih0LGUpe3RoaXMud3JpdGVWYXJpbnRGaWVsZCh0LEJvb2xlYW4oZSkpfX07ZnVuY3Rpb24gam8odCxlLG4pe3ZhciByPW4uYnVmLGksbztpZihvPXJbbi5wb3MrK10saT0obyYxMTIpPj40LG88MTI4fHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDMsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEyNyk8PDEwLG88MTI4KXx8KG89cltuLnBvcysrXSxpfD0obyYxMjcpPDwxNyxvPDEyOCl8fChvPXJbbi5wb3MrK10saXw9KG8mMTI3KTw8MjQsbzwxMjgpfHwobz1yW24ucG9zKytdLGl8PShvJjEpPDwzMSxvPDEyOCkpcmV0dXJuIFRlKHQsaSxlKTt0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzIil9ZnVuY3Rpb24gV3QodCl7cmV0dXJuIHQudHlwZT09PWsuQnl0ZXM/dC5yZWFkVmFyaW50KCkrdC5wb3M6dC5wb3MrMX1mdW5jdGlvbiBUZSh0LGUsbil7cmV0dXJuIG4/ZSo0Mjk0OTY3Mjk2Kyh0Pj4+MCk6KGU+Pj4wKSo0Mjk0OTY3Mjk2Kyh0Pj4+MCl9ZnVuY3Rpb24gR28odCxlKXt2YXIgbixyO2lmKHQ+PTA/KG49dCU0Mjk0OTY3Mjk2fDAscj10LzQyOTQ5NjcyOTZ8MCk6KG49figtdCU0Mjk0OTY3Mjk2KSxyPX4oLXQvNDI5NDk2NzI5Niksbl40Mjk0OTY3Mjk1P249bisxfDA6KG49MCxyPXIrMXwwKSksdD49MTg0NDY3NDQwNzM3MDk1NTJlM3x8dDwtMTg0NDY3NDQwNzM3MDk1NTJlMyl0aHJvdyBuZXcgRXJyb3IoIkdpdmVuIHZhcmludCBkb2Vzbid0IGZpdCBpbnRvIDEwIGJ5dGVzIik7ZS5yZWFsbG9jKDEwKSwkbyhuLHIsZSksa28ocixlKX1mdW5jdGlvbiAkbyh0LGUsbil7bi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvcysrXT10JjEyN3wxMjgsdD4+Pj03LG4uYnVmW24ucG9zKytdPXQmMTI3fDEyOCx0Pj4+PTcsbi5idWZbbi5wb3MrK109dCYxMjd8MTI4LHQ+Pj49NyxuLmJ1ZltuLnBvc109dCYxMjd9ZnVuY3Rpb24ga28odCxlKXt2YXIgbj0odCY3KTw8NDtlLmJ1ZltlLnBvcysrXXw9bnwoKHQ+Pj49Myk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyN3woKHQ+Pj49Nyk/MTI4OjApLHQmJihlLmJ1ZltlLnBvcysrXT10JjEyNykpKSkpfWZ1bmN0aW9uIENyKHQsZSxuKXt2YXIgcj1lPD0xNjM4Mz8xOmU8PTIwOTcxNTE/MjplPD0yNjg0MzU0NTU/MzpNYXRoLmZsb29yKE1hdGgubG9nKGUpLyhNYXRoLkxOMio3KSk7bi5yZWFsbG9jKHIpO2Zvcih2YXIgaT1uLnBvcy0xO2k+PXQ7aS0tKW4uYnVmW2krcl09bi5idWZbaV19ZnVuY3Rpb24gVm8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlVmFyaW50KHRbbl0pfWZ1bmN0aW9uIFhvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNWYXJpbnQodFtuXSl9ZnVuY3Rpb24gV28odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRmxvYXQodFtuXSl9ZnVuY3Rpb24gem8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRG91YmxlKHRbbl0pfWZ1bmN0aW9uIEhvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZUJvb2xlYW4odFtuXSl9ZnVuY3Rpb24gcW8odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLndyaXRlRml4ZWQzMih0W25dKX1mdW5jdGlvbiBLbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVTRml4ZWQzMih0W25dKX1mdW5jdGlvbiBZbyh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWUud3JpdGVGaXhlZDY0KHRbbl0pfWZ1bmN0aW9uIFpvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZS53cml0ZVNGaXhlZDY0KHRbbl0pfWZ1bmN0aW9uIHJuKHQsZSl7cmV0dXJuKHRbZV18dFtlKzFdPDw4fHRbZSsyXTw8MTYpK3RbZSszXSoxNjc3NzIxNn1mdW5jdGlvbiBSZSh0LGUsbil7dFtuXT1lLHRbbisxXT1lPj4+OCx0W24rMl09ZT4+PjE2LHRbbiszXT1lPj4+MjR9ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4odFtlXXx0W2UrMV08PDh8dFtlKzJdPDwxNikrKHRbZSszXTw8MjQpfWZ1bmN0aW9uIFFvKHQsZSxuKXtmb3IodmFyIHI9IiIsaT1lO2k8bjspe3ZhciBvPXRbaV0scz1udWxsLGg9bz4yMzk/NDpvPjIyMz8zOm8+MTkxPzI6MTtpZihpK2g+bilicmVhazt2YXIgYSxmLGQ7aD09PTE/bzwxMjgmJihzPW8pOmg9PT0yPyhhPXRbaSsxXSwoYSYxOTIpPT09MTI4JiYocz0obyYzMSk8PDZ8YSY2MyxzPD0xMjcmJihzPW51bGwpKSk6aD09PTM/KGE9dFtpKzFdLGY9dFtpKzJdLChhJjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihzPShvJjE1KTw8MTJ8KGEmNjMpPDw2fGYmNjMsKHM8PTIwNDd8fHM+PTU1Mjk2JiZzPD01NzM0MykmJihzPW51bGwpKSk6aD09PTQmJihhPXRbaSsxXSxmPXRbaSsyXSxkPXRbaSszXSwoYSYxOTIpPT09MTI4JiYoZiYxOTIpPT09MTI4JiYoZCYxOTIpPT09MTI4JiYocz0obyYxNSk8PDE4fChhJjYzKTw8MTJ8KGYmNjMpPDw2fGQmNjMsKHM8PTY1NTM1fHxzPj0xMTE0MTEyKSYmKHM9bnVsbCkpKSxzPT09bnVsbD8ocz02NTUzMyxoPTEpOnM+NjU1MzUmJihzLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHM+Pj4xMCYxMDIzfDU1Mjk2KSxzPTU2MzIwfHMmMTAyMykscis9U3RyaW5nLmZyb21DaGFyQ29kZShzKSxpKz1ofXJldHVybiByfWZ1bmN0aW9uIEpvKHQsZSxuKXtyZXR1cm4gSXIuZGVjb2RlKHQuc3ViYXJyYXkoZSxuKSl9ZnVuY3Rpb24gdHModCxlLG4pe2Zvcih2YXIgcj0wLGksbztyPGUubGVuZ3RoO3IrKyl7aWYoaT1lLmNoYXJDb2RlQXQociksaT41NTI5NSYmaTw1NzM0NClpZihvKWlmKGk8NTYzMjApe3RbbisrXT0yMzksdFtuKytdPTE5MSx0W24rK109MTg5LG89aTtjb250aW51ZX1lbHNlIGk9by01NTI5Njw8MTB8aS01NjMyMHw2NTUzNixvPW51bGw7ZWxzZXtpPjU2MzE5fHxyKzE9PT1lLmxlbmd0aD8odFtuKytdPTIzOSx0W24rK109MTkxLHRbbisrXT0xODkpOm89aTtjb250aW51ZX1lbHNlIG8mJih0W24rK109MjM5LHRbbisrXT0xOTEsdFtuKytdPTE4OSxvPW51bGwpO2k8MTI4P3RbbisrXT1pOihpPDIwNDg/dFtuKytdPWk+PjZ8MTkyOihpPDY1NTM2P3RbbisrXT1pPj4xMnwyMjQ6KHRbbisrXT1pPj4xOHwyNDAsdFtuKytdPWk+PjEyJjYzfDEyOCksdFtuKytdPWk+PjYmNjN8MTI4KSx0W24rK109aSY2M3wxMjgpfXJldHVybiBufXZhciBlcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsTXI9ZXMsbnM9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixycz1Ncnx8bnN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksanQ9cnMsaXM9anQuU3ltYm9sLEd0PWlzLEZyPU9iamVjdC5wcm90b3R5cGUsb3M9RnIuaGFzT3duUHJvcGVydHksc3M9RnIudG9TdHJpbmcsRGU9R3Q/R3QudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGFzKHQpe3ZhciBlPW9zLmNhbGwodCxEZSksbj10W0RlXTt0cnl7dFtEZV09dm9pZCAwO3ZhciByPSEwfWNhdGNoe312YXIgaT1zcy5jYWxsKHQpO3JldHVybiByJiYoZT90W0RlXT1uOmRlbGV0ZSB0W0RlXSksaX12YXIgaHM9T2JqZWN0LnByb3RvdHlwZSxjcz1ocy50b1N0cmluZztmdW5jdGlvbiB1cyh0KXtyZXR1cm4gY3MuY2FsbCh0KX12YXIgZnM9IltvYmplY3QgTnVsbF0iLGxzPSJbb2JqZWN0IFVuZGVmaW5lZF0iLExyPUd0P0d0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBiZSh0KXtyZXR1cm4gdD09bnVsbD90PT09dm9pZCAwP2xzOmZzOkxyJiZMciBpbiBPYmplY3QodCk/YXModCk6dXModCl9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIHQhPW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0In12YXIgZHM9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gQ24odCl7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sInx8Z2UodCkmJmJlKHQpPT1kc31mdW5jdGlvbiBFcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfXZhciBfcz1BcnJheS5pc0FycmF5LFl0PV9zLHBzPTEvMCxQcj1HdD9HdC5wcm90b3R5cGU6dm9pZCAwLHZyPVByP1ByLnRvU3RyaW5nOnZvaWQgMDtmdW5jdGlvbiBEcih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ7aWYoWXQodCkpcmV0dXJuIEVzKHQsRHIpKyIiO2lmKENuKHQpKXJldHVybiB2cj92ci5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIGU9PSIwIiYmMS90PT0tcHM/Ii0wIjplfWZ1bmN0aW9uIG9lKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYoZT09Im9iamVjdCJ8fGU9PSJmdW5jdGlvbiIpfWZ1bmN0aW9uIHlzKHQpe3JldHVybiB0fXZhciBBcz0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIseHM9IltvYmplY3QgRnVuY3Rpb25dIixPcz0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLFRzPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gQnIodCl7aWYoIW9lKHQpKXJldHVybiExO3ZhciBlPWJlKHQpO3JldHVybiBlPT14c3x8ZT09T3N8fGU9PUFzfHxlPT1Uc312YXIgUnM9anRbIl9fY29yZS1qc19zaGFyZWRfXyJdLE5uPVJzLFVyPWZ1bmN0aW9uKCl7dmFyIHQ9L1teLl0rJC8uZXhlYyhObiYmTm4ua2V5cyYmTm4ua2V5cy5JRV9QUk9UT3x8IiIpO3JldHVybiB0PyJTeW1ib2woc3JjKV8xLiIrdDoiIn0oKTtmdW5jdGlvbiBicyh0KXtyZXR1cm4hIVVyJiZVciBpbiB0fXZhciBncz1GdW5jdGlvbi5wcm90b3R5cGUsbXM9Z3MudG9TdHJpbmc7ZnVuY3Rpb24gc2UodCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBtcy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgU3M9L1tcXF4kLiorPygpW1xde318XS9nLHdzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLElzPUZ1bmN0aW9uLnByb3RvdHlwZSxDcz1PYmplY3QucHJvdG90eXBlLE5zPUlzLnRvU3RyaW5nLE1zPUNzLmhhc093blByb3BlcnR5LEZzPVJlZ0V4cCgiXiIrTnMuY2FsbChNcykucmVwbGFjZShTcywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtmdW5jdGlvbiBMcyh0KXtpZighb2UodCl8fGJzKHQpKXJldHVybiExO3ZhciBlPUJyKHQpP0ZzOndzO3JldHVybiBlLnRlc3Qoc2UodCkpfWZ1bmN0aW9uIFBzKHQsZSl7cmV0dXJuIHQ9PW51bGw/dm9pZCAwOnRbZV19ZnVuY3Rpb24gYWUodCxlKXt2YXIgbj1Qcyh0LGUpO3JldHVybiBMcyhuKT9uOnZvaWQgMH12YXIgdnM9YWUoanQsIldlYWtNYXAiKSxNbj12cyxqcj1PYmplY3QuY3JlYXRlLERzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIW9lKGUpKXJldHVybnt9O2lmKGpyKXJldHVybiBqcihlKTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT12b2lkIDAsbn19KCksQnM9RHM7ZnVuY3Rpb24gVXModCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX1mdW5jdGlvbiBqcyh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGV8fChlPUFycmF5KHIpKTsrK248cjspZVtuXT10W25dO3JldHVybiBlfXZhciBHcz04MDAsJHM9MTYsa3M9RGF0ZS5ub3c7ZnVuY3Rpb24gVnModCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9a3MoKSxpPSRzLShyLW4pO2lmKG49cixpPjApe2lmKCsrZT49R3MpcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19ZnVuY3Rpb24gWHModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBXcz1mdW5jdGlvbigpe3RyeXt2YXIgdD1hZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0oKSxvbj1Xcyx6cz1vbj9mdW5jdGlvbih0LGUpe3JldHVybiBvbih0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlhzKGUpLHdyaXRhYmxlOiEwfSl9OnlzLEhzPXpzLHFzPVZzKEhzKSxLcz1xcztmdW5jdGlvbiBZcyh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK248ciYmZSh0W25dLG4sdCkhPT0hMTspO3JldHVybiB0fXZhciBacz05MDA3MTk5MjU0NzQwOTkxLFFzPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBGbih0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiBlPWU/P1pzLCEhZSYmKG49PSJudW1iZXIifHxuIT0ic3ltYm9sIiYmUXMudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIEdyKHQsZSxuKXtlPT0iX19wcm90b19fIiYmb24/b24odCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufWZ1bmN0aW9uICRyKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT09dCYmZSE9PWV9dmFyIEpzPU9iamVjdC5wcm90b3R5cGUsdGE9SnMuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gTG4odCxlLG4pe3ZhciByPXRbZV07KCEodGEuY2FsbCh0LGUpJiYkcihyLG4pKXx8bj09PXZvaWQgMCYmIShlIGluIHQpKSYmR3IodCxlLG4pfWZ1bmN0aW9uIHNuKHQsZSxuLHIpe3ZhciBpPSFuO258fChuPXt9KTtmb3IodmFyIG89LTEscz1lLmxlbmd0aDsrK288czspe3ZhciBoPWVbb10sYT1yP3IobltoXSx0W2hdLGgsbix0KTp2b2lkIDA7YT09PXZvaWQgMCYmKGE9dFtoXSksaT9HcihuLGgsYSk6TG4obixoLGEpfXJldHVybiBufXZhciBrcj1NYXRoLm1heDtmdW5jdGlvbiBlYSh0LGUsbil7cmV0dXJuIGU9a3IoZT09PXZvaWQgMD90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIHI9YXJndW1lbnRzLGk9LTEsbz1rcihyLmxlbmd0aC1lLDApLHM9QXJyYXkobyk7KytpPG87KXNbaV09cltlK2ldO2k9LTE7Zm9yKHZhciBoPUFycmF5KGUrMSk7KytpPGU7KWhbaV09cltpXTtyZXR1cm4gaFtlXT1uKHMpLFVzKHQsdGhpcyxoKX19dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gUG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiBWcih0KXtyZXR1cm4gdCE9bnVsbCYmUG4odC5sZW5ndGgpJiYhQnIodCl9dmFyIHJhPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gdm4odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcixuPXR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnByb3RvdHlwZXx8cmE7cmV0dXJuIHQ9PT1ufWZ1bmN0aW9uIGlhKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn12YXIgb2E9IltvYmplY3QgQXJndW1lbnRzXSI7ZnVuY3Rpb24gWHIodCl7cmV0dXJuIGdlKHQpJiZiZSh0KT09b2F9dmFyIFdyPU9iamVjdC5wcm90b3R5cGUsc2E9V3IuaGFzT3duUHJvcGVydHksYWE9V3IucHJvcGVydHlJc0VudW1lcmFibGUsaGE9WHIoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9YcjpmdW5jdGlvbih0KXtyZXR1cm4gZ2UodCkmJnNhLmNhbGwodCwiY2FsbGVlIikmJiFhYS5jYWxsKHQsImNhbGxlZSIpfSxEbj1oYTtmdW5jdGlvbiBjYSgpe3JldHVybiExfXZhciB6cj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLEhyPXpyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsdWE9SHImJkhyLmV4cG9ydHM9PT16cixxcj11YT9qdC5CdWZmZXI6dm9pZCAwLGZhPXFyP3FyLmlzQnVmZmVyOnZvaWQgMCxsYT1mYXx8Y2EsS3I9bGEsZGE9IltvYmplY3QgQXJndW1lbnRzXSIsRWE9IltvYmplY3QgQXJyYXldIixfYT0iW29iamVjdCBCb29sZWFuXSIscGE9IltvYmplY3QgRGF0ZV0iLHlhPSJbb2JqZWN0IEVycm9yXSIsQWE9IltvYmplY3QgRnVuY3Rpb25dIix4YT0iW29iamVjdCBNYXBdIixPYT0iW29iamVjdCBOdW1iZXJdIixUYT0iW29iamVjdCBPYmplY3RdIixSYT0iW29iamVjdCBSZWdFeHBdIixiYT0iW29iamVjdCBTZXRdIixnYT0iW29iamVjdCBTdHJpbmddIixtYT0iW29iamVjdCBXZWFrTWFwXSIsU2E9IltvYmplY3QgQXJyYXlCdWZmZXJdIix3YT0iW29iamVjdCBEYXRhVmlld10iLElhPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLENhPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLE5hPSJbb2JqZWN0IEludDhBcnJheV0iLE1hPSJbb2JqZWN0IEludDE2QXJyYXldIixGYT0iW29iamVjdCBJbnQzMkFycmF5XSIsTGE9IltvYmplY3QgVWludDhBcnJheV0iLFBhPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsdmE9IltvYmplY3QgVWludDE2QXJyYXldIixEYT0iW29iamVjdCBVaW50MzJBcnJheV0iLEo9e307SltJYV09SltDYV09SltOYV09SltNYV09SltGYV09SltMYV09SltQYV09Slt2YV09SltEYV09ITAsSltkYV09SltFYV09SltTYV09SltfYV09Slt3YV09SltwYV09Slt5YV09SltBYV09Slt4YV09SltPYV09SltUYV09SltSYV09SltiYV09SltnYV09SlttYV09ITE7ZnVuY3Rpb24gQmEodCl7cmV0dXJuIGdlKHQpJiZQbih0Lmxlbmd0aCkmJiEhSltiZSh0KV19ZnVuY3Rpb24gQm4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgWXI9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxCZT1ZciYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLFVhPUJlJiZCZS5leHBvcnRzPT09WXIsVW49VWEmJk1yLnByb2Nlc3MsamE9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9QmUmJkJlLnJlcXVpcmUmJkJlLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8VW4mJlVuLmJpbmRpbmcmJlVuLmJpbmRpbmcoInV0aWwiKX1jYXRjaHt9fSgpLG1lPWphLFpyPW1lJiZtZS5pc1R5cGVkQXJyYXksR2E9WnI/Qm4oWnIpOkJhLCRhPUdhLGthPU9iamVjdC5wcm90b3R5cGUsVmE9a2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUXIodCxlKXt2YXIgbj1ZdCh0KSxyPSFuJiZEbih0KSxpPSFuJiYhciYmS3IodCksbz0hbiYmIXImJiFpJiYkYSh0KSxzPW58fHJ8fGl8fG8saD1zP2lhKHQubGVuZ3RoLFN0cmluZyk6W10sYT1oLmxlbmd0aDtmb3IodmFyIGYgaW4gdCkoZXx8VmEuY2FsbCh0LGYpKSYmIShzJiYoZj09Imxlbmd0aCJ8fGkmJihmPT0ib2Zmc2V0Inx8Zj09InBhcmVudCIpfHxvJiYoZj09ImJ1ZmZlciJ8fGY9PSJieXRlTGVuZ3RoInx8Zj09ImJ5dGVPZmZzZXQiKXx8Rm4oZixhKSkpJiZoLnB1c2goZik7cmV0dXJuIGh9ZnVuY3Rpb24gSnIodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fXZhciBYYT1KcihPYmplY3Qua2V5cyxPYmplY3QpLFdhPVhhLHphPU9iamVjdC5wcm90b3R5cGUsSGE9emEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcWEodCl7aWYoIXZuKHQpKXJldHVybiBXYSh0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KHQpKUhhLmNhbGwodCxuKSYmbiE9ImNvbnN0cnVjdG9yIiYmZS5wdXNoKG4pO3JldHVybiBlfWZ1bmN0aW9uIGpuKHQpe3JldHVybiBWcih0KT9Rcih0KTpxYSh0KX1mdW5jdGlvbiBLYSh0KXt2YXIgZT1bXTtpZih0IT1udWxsKWZvcih2YXIgbiBpbiBPYmplY3QodCkpZS5wdXNoKG4pO3JldHVybiBlfXZhciBZYT1PYmplY3QucHJvdG90eXBlLFphPVlhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFhKHQpe2lmKCFvZSh0KSlyZXR1cm4gS2EodCk7dmFyIGU9dm4odCksbj1bXTtmb3IodmFyIHIgaW4gdClyPT0iY29uc3RydWN0b3IiJiYoZXx8IVphLmNhbGwodCxyKSl8fG4ucHVzaChyKTtyZXR1cm4gbn1mdW5jdGlvbiBHbih0KXtyZXR1cm4gVnIodCk/UXIodCwhMCk6UWEodCl9dmFyIEphPS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLHRoPS9eXHcqJC87ZnVuY3Rpb24gZWgodCxlKXtpZihZdCh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4gbj09Im51bWJlciJ8fG49PSJzeW1ib2wifHxuPT0iYm9vbGVhbiJ8fHQ9PW51bGx8fENuKHQpPyEwOnRoLnRlc3QodCl8fCFKYS50ZXN0KHQpfHxlIT1udWxsJiZ0IGluIE9iamVjdChlKX12YXIgbmg9YWUoT2JqZWN0LCJjcmVhdGUiKSxVZT1uaDtmdW5jdGlvbiByaCgpe3RoaXMuX19kYXRhX189VWU/VWUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gaWgodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIG9oPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixzaD1PYmplY3QucHJvdG90eXBlLGFoPXNoLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGhoKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoVWUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1vaD92b2lkIDA6bn1yZXR1cm4gYWguY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBjaD1PYmplY3QucHJvdG90eXBlLHVoPWNoLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGZoKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFVlP2VbdF0hPT12b2lkIDA6dWguY2FsbChlLHQpfXZhciBsaD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZGgodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVVlJiZlPT09dm9pZCAwP2xoOmUsdGhpc31mdW5jdGlvbiBoZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1oZS5wcm90b3R5cGUuY2xlYXI9cmgsaGUucHJvdG90eXBlLmRlbGV0ZT1paCxoZS5wcm90b3R5cGUuZ2V0PWhoLGhlLnByb3RvdHlwZS5oYXM9ZmgsaGUucHJvdG90eXBlLnNldD1kaDtmdW5jdGlvbiBFaCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gYW4odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZigkcih0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciBfaD1BcnJheS5wcm90b3R5cGUscGg9X2guc3BsaWNlO2Z1bmN0aW9uIHloKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1hbihlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6cGguY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gQWgodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWFuKGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiB4aCh0KXtyZXR1cm4gYW4odGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBPaCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1hbihuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHp0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXp0LnByb3RvdHlwZS5jbGVhcj1FaCx6dC5wcm90b3R5cGUuZGVsZXRlPXloLHp0LnByb3RvdHlwZS5nZXQ9QWgsenQucHJvdG90eXBlLmhhcz14aCx6dC5wcm90b3R5cGUuc2V0PU9oO3ZhciBUaD1hZShqdCwiTWFwIiksamU9VGg7ZnVuY3Rpb24gUmgoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBoZSxtYXA6bmV3KGplfHx6dCksc3RyaW5nOm5ldyBoZX19ZnVuY3Rpb24gYmgodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaG4odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBiaChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGdoKHQpe3ZhciBlPWhuKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gbWgodCl7cmV0dXJuIGhuKHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIFNoKHQpe3JldHVybiBobih0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiB3aCh0LGUpe3ZhciBuPWhuKHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gWnQodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19WnQucHJvdG90eXBlLmNsZWFyPVJoLFp0LnByb3RvdHlwZS5kZWxldGU9Z2gsWnQucHJvdG90eXBlLmdldD1taCxadC5wcm90b3R5cGUuaGFzPVNoLFp0LnByb3RvdHlwZS5zZXQ9d2g7dmFyIEloPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjtmdW5jdGlvbiAkbih0LGUpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24ifHxlIT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEloKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gbi5jYWNoZT1uZXcoJG4uQ2FjaGV8fFp0KSxufSRuLkNhY2hlPVp0O3ZhciBDaD01MDA7ZnVuY3Rpb24gTmgodCl7dmFyIGU9JG4odCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09Q2gmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBNaD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxGaD0vXFwoXFwpPy9nLExoPU5oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoTWgsZnVuY3Rpb24obixyLGksbyl7ZS5wdXNoKGk/by5yZXBsYWNlKEZoLCIkMSIpOnJ8fG4pfSksZX0pLFBoPUxoO2Z1bmN0aW9uIHZoKHQpe3JldHVybiB0PT1udWxsPyIiOkRyKHQpfWZ1bmN0aW9uIGNuKHQsZSl7cmV0dXJuIFl0KHQpP3Q6ZWgodCxlKT9bdF06UGgodmgodCkpfXZhciBEaD0xLzA7ZnVuY3Rpb24ga24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxDbih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LURoPyItMCI6ZX1mdW5jdGlvbiBCaCh0LGUpe2U9Y24oZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W2tuKGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIFZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9dmFyIHRpPUd0P0d0LmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7ZnVuY3Rpb24gVWgodCl7cmV0dXJuIFl0KHQpfHxEbih0KXx8ISEodGkmJnQmJnRbdGldKX1mdW5jdGlvbiBlaSh0LGUsbixyLGkpe3ZhciBvPS0xLHM9dC5sZW5ndGg7Zm9yKG58fChuPVVoKSxpfHwoaT1bXSk7KytvPHM7KXt2YXIgaD10W29dO2U+MCYmbihoKT9lPjE/ZWkoaCxlLTEsbixyLGkpOlZuKGksaCk6cnx8KGlbaS5sZW5ndGhdPWgpfXJldHVybiBpfWZ1bmN0aW9uIGpoKHQpe3ZhciBlPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4gZT9laSh0LDEpOltdfWZ1bmN0aW9uIEdoKHQpe3JldHVybiBLcyhlYSh0LHZvaWQgMCxqaCksdCsiIil9dmFyICRoPUpyKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLG5pPSRoO2Z1bmN0aW9uIGtoKCl7dGhpcy5fX2RhdGFfXz1uZXcgenQsdGhpcy5zaXplPTB9ZnVuY3Rpb24gVmgodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59ZnVuY3Rpb24gWGgodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfWZ1bmN0aW9uIFdoKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX12YXIgemg9MjAwO2Z1bmN0aW9uIEhoKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgenQpe3ZhciByPW4uX19kYXRhX187aWYoIWplfHxyLmxlbmd0aDx6aC0xKXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgWnQocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfWZ1bmN0aW9uIFNlKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IHp0KHQpO3RoaXMuc2l6ZT1lLnNpemV9U2UucHJvdG90eXBlLmNsZWFyPWtoLFNlLnByb3RvdHlwZS5kZWxldGU9VmgsU2UucHJvdG90eXBlLmdldD1YaCxTZS5wcm90b3R5cGUuaGFzPVdoLFNlLnByb3RvdHlwZS5zZXQ9SGg7ZnVuY3Rpb24gcWgodCxlKXtyZXR1cm4gdCYmc24oZSxqbihlKSx0KX1mdW5jdGlvbiBLaCh0LGUpe3JldHVybiB0JiZzbihlLEduKGUpLHQpfXZhciByaT10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGlpPXJpJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsWWg9aWkmJmlpLmV4cG9ydHM9PT1yaSxvaT1ZaD9qdC5CdWZmZXI6dm9pZCAwLHNpPW9pP29pLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBaaCh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxyPXNpP3NpKG4pOm5ldyB0LmNvbnN0cnVjdG9yKG4pO3JldHVybiB0LmNvcHkocikscn1mdW5jdGlvbiBRaCh0LGUpe2Zvcih2YXIgbj0tMSxyPXQ9PW51bGw/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl07ZShzLG4sdCkmJihvW2krK109cyl9cmV0dXJuIG99ZnVuY3Rpb24gYWkoKXtyZXR1cm5bXX12YXIgSmg9T2JqZWN0LnByb3RvdHlwZSx0Yz1KaC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGVjPWhpP2Z1bmN0aW9uKHQpe3JldHVybiB0PT1udWxsP1tdOih0PU9iamVjdCh0KSxRaChoaSh0KSxmdW5jdGlvbihlKXtyZXR1cm4gdGMuY2FsbCh0LGUpfSkpfTphaSxYbj1lYztmdW5jdGlvbiBuYyh0LGUpe3JldHVybiBzbih0LFhuKHQpLGUpfXZhciByYz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGljPXJjP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXTt0OylWbihlLFhuKHQpKSx0PW5pKHQpO3JldHVybiBlfTphaSxjaT1pYztmdW5jdGlvbiBvYyh0LGUpe3JldHVybiBzbih0LGNpKHQpLGUpfWZ1bmN0aW9uIHVpKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBZdCh0KT9yOlZuKHIsbih0KSl9ZnVuY3Rpb24gc2ModCl7cmV0dXJuIHVpKHQsam4sWG4pfWZ1bmN0aW9uIGFjKHQpe3JldHVybiB1aSh0LEduLGNpKX12YXIgaGM9YWUoanQsIkRhdGFWaWV3IiksV249aGMsY2M9YWUoanQsIlByb21pc2UiKSx6bj1jYyx1Yz1hZShqdCwiU2V0IiksSG49dWMsZmk9IltvYmplY3QgTWFwXSIsZmM9IltvYmplY3QgT2JqZWN0XSIsbGk9IltvYmplY3QgUHJvbWlzZV0iLGRpPSJbb2JqZWN0IFNldF0iLEVpPSJbb2JqZWN0IFdlYWtNYXBdIixfaT0iW29iamVjdCBEYXRhVmlld10iLGxjPXNlKFduKSxkYz1zZShqZSksRWM9c2Uoem4pLF9jPXNlKEhuKSxwYz1zZShNbiksY2U9YmU7KFduJiZjZShuZXcgV24obmV3IEFycmF5QnVmZmVyKDEpKSkhPV9pfHxqZSYmY2UobmV3IGplKSE9Zml8fHpuJiZjZSh6bi5yZXNvbHZlKCkpIT1saXx8SG4mJmNlKG5ldyBIbikhPWRpfHxNbiYmY2UobmV3IE1uKSE9RWkpJiYoY2U9ZnVuY3Rpb24odCl7dmFyIGU9YmUodCksbj1lPT1mYz90LmNvbnN0cnVjdG9yOnZvaWQgMCxyPW4/c2Uobik6IiI7aWYocilzd2l0Y2gocil7Y2FzZSBsYzpyZXR1cm4gX2k7Y2FzZSBkYzpyZXR1cm4gZmk7Y2FzZSBFYzpyZXR1cm4gbGk7Y2FzZSBfYzpyZXR1cm4gZGk7Y2FzZSBwYzpyZXR1cm4gRWl9cmV0dXJuIGV9KTt2YXIgcW49Y2UseWM9T2JqZWN0LnByb3RvdHlwZSxBYz15Yy5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB4Yyh0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiZ0eXBlb2YgdFswXT09InN0cmluZyImJkFjLmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59dmFyIE9jPWp0LlVpbnQ4QXJyYXkscGk9T2M7ZnVuY3Rpb24gS24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHBpKGUpLnNldChuZXcgcGkodCkpLGV9ZnVuY3Rpb24gVGModCxlKXt2YXIgbj1lP0tuKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX12YXIgUmM9L1x3KiQvO2Z1bmN0aW9uIGJjKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLFJjLmV4ZWModCkpO3JldHVybiBlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlfXZhciB5aT1HdD9HdC5wcm90b3R5cGU6dm9pZCAwLEFpPXlpP3lpLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIGdjKHQpe3JldHVybiBBaT9PYmplY3QoQWkuY2FsbCh0KSk6e319ZnVuY3Rpb24gbWModCxlKXt2YXIgbj1lP0tuKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfXZhciBTYz0iW29iamVjdCBCb29sZWFuXSIsd2M9IltvYmplY3QgRGF0ZV0iLEljPSJbb2JqZWN0IE1hcF0iLENjPSJbb2JqZWN0IE51bWJlcl0iLE5jPSJbb2JqZWN0IFJlZ0V4cF0iLE1jPSJbb2JqZWN0IFNldF0iLEZjPSJbb2JqZWN0IFN0cmluZ10iLExjPSJbb2JqZWN0IFN5bWJvbF0iLFBjPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdmM9IltvYmplY3QgRGF0YVZpZXddIixEYz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixCYz0iW29iamVjdCBGbG9hdDY0QXJyYXldIixVYz0iW29iamVjdCBJbnQ4QXJyYXldIixqYz0iW29iamVjdCBJbnQxNkFycmF5XSIsR2M9IltvYmplY3QgSW50MzJBcnJheV0iLCRjPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixrYz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFZjPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsWGM9IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBXYyh0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBQYzpyZXR1cm4gS24odCk7Y2FzZSBTYzpjYXNlIHdjOnJldHVybiBuZXcgcigrdCk7Y2FzZSB2YzpyZXR1cm4gVGModCxuKTtjYXNlIERjOmNhc2UgQmM6Y2FzZSBVYzpjYXNlIGpjOmNhc2UgR2M6Y2FzZSAkYzpjYXNlIGtjOmNhc2UgVmM6Y2FzZSBYYzpyZXR1cm4gbWModCxuKTtjYXNlIEljOnJldHVybiBuZXcgcjtjYXNlIENjOmNhc2UgRmM6cmV0dXJuIG5ldyByKHQpO2Nhc2UgTmM6cmV0dXJuIGJjKHQpO2Nhc2UgTWM6cmV0dXJuIG5ldyByO2Nhc2UgTGM6cmV0dXJuIGdjKHQpfX1mdW5jdGlvbiB6Yyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiF2bih0KT9CcyhuaSh0KSk6e319dmFyIEhjPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIHFjKHQpe3JldHVybiBnZSh0KSYmcW4odCk9PUhjfXZhciB4aT1tZSYmbWUuaXNNYXAsS2M9eGk/Qm4oeGkpOnFjLFljPUtjLFpjPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFFjKHQpe3JldHVybiBnZSh0KSYmcW4odCk9PVpjfXZhciBPaT1tZSYmbWUuaXNTZXQsSmM9T2k/Qm4oT2kpOlFjLHR1PUpjLGV1PTEsbnU9MixydT00LFRpPSJbb2JqZWN0IEFyZ3VtZW50c10iLGl1PSJbb2JqZWN0IEFycmF5XSIsb3U9IltvYmplY3QgQm9vbGVhbl0iLHN1PSJbb2JqZWN0IERhdGVdIixhdT0iW29iamVjdCBFcnJvcl0iLFJpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsaHU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixjdT0iW29iamVjdCBNYXBdIix1dT0iW29iamVjdCBOdW1iZXJdIixiaT0iW29iamVjdCBPYmplY3RdIixmdT0iW29iamVjdCBSZWdFeHBdIixsdT0iW29iamVjdCBTZXRdIixkdT0iW29iamVjdCBTdHJpbmddIixFdT0iW29iamVjdCBTeW1ib2xdIixfdT0iW29iamVjdCBXZWFrTWFwXSIscHU9IltvYmplY3QgQXJyYXlCdWZmZXJdIix5dT0iW29iamVjdCBEYXRhVmlld10iLEF1PSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHh1PSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLE91PSJbb2JqZWN0IEludDhBcnJheV0iLFR1PSJbb2JqZWN0IEludDE2QXJyYXldIixSdT0iW29iamVjdCBJbnQzMkFycmF5XSIsYnU9IltvYmplY3QgVWludDhBcnJheV0iLGd1PSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsbXU9IltvYmplY3QgVWludDE2QXJyYXldIixTdT0iW29iamVjdCBVaW50MzJBcnJheV0iLFo9e307WltUaV09WltpdV09WltwdV09Wlt5dV09WltvdV09WltzdV09WltBdV09Wlt4dV09WltPdV09WltUdV09WltSdV09WltjdV09Wlt1dV09WltiaV09WltmdV09WltsdV09WltkdV09WltFdV09WltidV09WltndV09WlttdV09WltTdV09ITAsWlthdV09WltSaV09WltfdV09ITE7ZnVuY3Rpb24gdW4odCxlLG4scixpLG8pe3ZhciBzLGg9ZSZldSxhPWUmbnUsZj1lJnJ1O2lmKG4mJihzPWk/bih0LHIsaSxvKTpuKHQpKSxzIT09dm9pZCAwKXJldHVybiBzO2lmKCFvZSh0KSlyZXR1cm4gdDt2YXIgZD1ZdCh0KTtpZihkKXtpZihzPXhjKHQpLCFoKXJldHVybiBqcyh0LHMpfWVsc2V7dmFyIF89cW4odCksUz1fPT1SaXx8Xz09aHU7aWYoS3IodCkpcmV0dXJuIFpoKHQsaCk7aWYoXz09Yml8fF89PVRpfHxTJiYhaSl7aWYocz1hfHxTP3t9OnpjKHQpLCFoKXJldHVybiBhP29jKHQsS2gocyx0KSk6bmModCxxaChzLHQpKX1lbHNle2lmKCFaW19dKXJldHVybiBpP3Q6e307cz1XYyh0LF8saCl9fW98fChvPW5ldyBTZSk7dmFyIE89by5nZXQodCk7aWYoTylyZXR1cm4gTztvLnNldCh0LHMpLHR1KHQpP3QuZm9yRWFjaChmdW5jdGlvbihNKXtzLmFkZCh1bihNLGUsbixNLHQsbykpfSk6WWModCkmJnQuZm9yRWFjaChmdW5jdGlvbihNLG0pe3Muc2V0KG0sdW4oTSxlLG4sbSx0LG8pKX0pO3ZhciB3PWY/YT9hYzpzYzphP0duOmpuLGI9ZD92b2lkIDA6dyh0KTtyZXR1cm4gWXMoYnx8dCxmdW5jdGlvbihNLG0pe2ImJihtPU0sTT10W21dKSxMbihzLG0sdW4oTSxlLG4sbSx0LG8pKX0pLHN9dmFyIHd1PTEsSXU9NDtmdW5jdGlvbiBDdSh0KXtyZXR1cm4gdW4odCx3dXxJdSl9ZnVuY3Rpb24gTnUodCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gTXUodCxlLG4pe2U9Y24oZSx0KTtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIHM9a24oZVtyXSk7aWYoIShvPXQhPW51bGwmJm4odCxzKSkpYnJlYWs7dD10W3NdfXJldHVybiBvfHwrK3IhPWk/bzooaT10PT1udWxsPzA6dC5sZW5ndGgsISFpJiZQbihpKSYmRm4ocyxpKSYmKFl0KHQpfHxEbih0KSkpfWZ1bmN0aW9uIEZ1KHQsZSl7cmV0dXJuIHQhPW51bGwmJk11KHQsZSxOdSl9ZnVuY3Rpb24gTHUodCxlLG4scil7aWYoIW9lKHQpKXJldHVybiB0O2U9Y24oZSx0KTtmb3IodmFyIGk9LTEsbz1lLmxlbmd0aCxzPW8tMSxoPXQ7aCE9bnVsbCYmKytpPG87KXt2YXIgYT1rbihlW2ldKSxmPW47aWYoYT09PSJfX3Byb3RvX18ifHxhPT09ImNvbnN0cnVjdG9yInx8YT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKGkhPXMpe3ZhciBkPWhbYV07Zj1yP3IoZCxhLGgpOnZvaWQgMCxmPT09dm9pZCAwJiYoZj1vZShkKT9kOkZuKGVbaSsxXSk/W106e30pfUxuKGgsYSxmKSxoPWhbYV19cmV0dXJuIHR9ZnVuY3Rpb24gUHUodCxlLG4pe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89e307KytyPGk7KXt2YXIgcz1lW3JdLGg9QmgodCxzKTtuKGgscykmJkx1KG8sY24ocyx0KSxoKX1yZXR1cm4gb31mdW5jdGlvbiB2dSh0LGUpe3JldHVybiBQdSh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gRnUodCxyKX0pfXZhciBEdT1HaChmdW5jdGlvbih0LGUpe3JldHVybiB0PT1udWxsP3t9OnZ1KHQsZSl9KSxCdT1EdTtmdW5jdGlvbiBVdSh0KXtyZXR1cm4gT2JqZWN0LmtleXModCl9ZnVuY3Rpb24gZHQodCxlKXtyZXR1cm4gdD8/ZX1jb25zdCBqdT1uZXcgZW4oMCwwKTtmdW5jdGlvbiBHdSh0LGUsbil7cmV0dXJuIHQubGVuZ3RoPT09MHx8dFswXS5sZW5ndGg9PT0wPyExOnRbMF1bMF0uZGlzdFNxcihlKTw9bioqMn1mdW5jdGlvbiAkdSh0LGUsbil7aWYodC5sZW5ndGg9PT0wKXJldHVybiExO2NvbnN0IHI9dFswXSxpPW4vMjtmb3IobGV0IG89MDtvPHIubGVuZ3RoLTE7bysrKXtjb25zdCBzPXJbb10saD1yW28rMV07aWYoa3UocyxoLGUsaSxqdSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24ga3UodCxlLG4scixpPW5ldyBlbigwLDApKXtjb25zdCBvPXQuZGlzdFNxcihlKTtpZihvPT09MClyZXR1cm4hMTtjb25zdCBzPSgobi54LXQueCkqKGUueC10LngpKyhuLnktdC55KSooZS55LXQueSkpL28saD1NYXRoLm1heCgwLE1hdGgubWluKDEscykpLGE9aTtyZXR1cm4gYS54PXQueCtoKihlLngtdC54KSxhLnk9dC55K2gqKGUueS10LnkpLG4uZGlzdFNxcihhKTw9cioqMn1jb25zdCBWdT10PT57bGV0IGU9MDtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10LmNoYXJDb2RlQXQobik7ZT0oZTw8NSktZStyLGUmPWV9cmV0dXJuIGUudG9TdHJpbmcoMTYpfSxYdT1VdSh7bWFya2VyOjEscG9seWxpbmU6MSxwb2x5Z29uOjEsZWxsaXBzb2lkOjEsZWxsaXBzZToxLG1vZGVsOjEsIjNkdGlsZXMiOjEsYm94OjEscGhvdG9vdmVybGF5OjEscmVzb3VyY2U6MSxyYXN0ZXI6MSxoZWF0TWFwOjEsZnJ1c3R1bToxLHRyYW5zaXRpb246MX0pO2xldCBXdT1jbGFzc3thZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19LHp1PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuanNlcD1lLHRoaXMucmVnaXN0ZXJlZD17fX1yZWdpc3RlciguLi5lKXtlLmZvckVhY2gobj0+e2lmKHR5cGVvZiBuIT0ib2JqZWN0Inx8IW4ubmFtZXx8IW4uaW5pdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgSlNFUCBwbHVnaW4gZm9ybWF0Iik7dGhpcy5yZWdpc3RlcmVkW24ubmFtZV18fChuLmluaXQodGhpcy5qc2VwKSx0aGlzLnJlZ2lzdGVyZWRbbi5uYW1lXT1uKX0pfX0sU3Q9Y2xhc3MgeXtzdGF0aWMgZ2V0IHZlcnNpb24oKXtyZXR1cm4iMS40LjAifXN0YXRpYyB0b1N0cmluZygpe3JldHVybiJKYXZhU2NyaXB0IEV4cHJlc3Npb24gUGFyc2VyIChKU0VQKSB2Iit5LnZlcnNpb259c3RhdGljIGFkZFVuYXJ5T3AoZSl7cmV0dXJuIHkubWF4X3Vub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLHkubWF4X3Vub3BfbGVuKSx5LnVuYXJ5X29wc1tlXT0xLHl9c3RhdGljIGFkZEJpbmFyeU9wKGUsbixyKXtyZXR1cm4geS5tYXhfYmlub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLHkubWF4X2Jpbm9wX2xlbikseS5iaW5hcnlfb3BzW2VdPW4scj95LnJpZ2h0X2Fzc29jaWF0aXZlLmFkZChlKTp5LnJpZ2h0X2Fzc29jaWF0aXZlLmRlbGV0ZShlKSx5fXN0YXRpYyBhZGRJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4geS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuYWRkKGUpLHl9c3RhdGljIGFkZExpdGVyYWwoZSxuKXtyZXR1cm4geS5saXRlcmFsc1tlXT1uLHl9c3RhdGljIHJlbW92ZVVuYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSB5LnVuYXJ5X29wc1tlXSxlLmxlbmd0aD09PXkubWF4X3Vub3BfbGVuJiYoeS5tYXhfdW5vcF9sZW49eS5nZXRNYXhLZXlMZW4oeS51bmFyeV9vcHMpKSx5fXN0YXRpYyByZW1vdmVBbGxVbmFyeU9wcygpe3JldHVybiB5LnVuYXJ5X29wcz17fSx5Lm1heF91bm9wX2xlbj0wLHl9c3RhdGljIHJlbW92ZUlkZW50aWZpZXJDaGFyKGUpe3JldHVybiB5LmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5kZWxldGUoZSkseX1zdGF0aWMgcmVtb3ZlQmluYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSB5LmJpbmFyeV9vcHNbZV0sZS5sZW5ndGg9PT15Lm1heF9iaW5vcF9sZW4mJih5Lm1heF9iaW5vcF9sZW49eS5nZXRNYXhLZXlMZW4oeS5iaW5hcnlfb3BzKSkseS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSkseX1zdGF0aWMgcmVtb3ZlQWxsQmluYXJ5T3BzKCl7cmV0dXJuIHkuYmluYXJ5X29wcz17fSx5Lm1heF9iaW5vcF9sZW49MCx5fXN0YXRpYyByZW1vdmVMaXRlcmFsKGUpe3JldHVybiBkZWxldGUgeS5saXRlcmFsc1tlXSx5fXN0YXRpYyByZW1vdmVBbGxMaXRlcmFscygpe3JldHVybiB5LmxpdGVyYWxzPXt9LHl9Z2V0IGNoYXIoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KX1nZXQgY29kZSgpe3JldHVybiB0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KX1jb25zdHJ1Y3RvcihlKXt0aGlzLmV4cHI9ZSx0aGlzLmluZGV4PTB9c3RhdGljIHBhcnNlKGUpe3JldHVybiBuZXcgeShlKS5wYXJzZSgpfXN0YXRpYyBnZXRNYXhLZXlMZW4oZSl7cmV0dXJuIE1hdGgubWF4KDAsLi4uT2JqZWN0LmtleXMoZSkubWFwKG49Pm4ubGVuZ3RoKSl9c3RhdGljIGlzRGVjaW1hbERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTd9c3RhdGljIGJpbmFyeVByZWNlZGVuY2UoZSl7cmV0dXJuIHkuYmluYXJ5X29wc1tlXXx8MH1zdGF0aWMgaXNJZGVudGlmaWVyU3RhcnQoZSl7cmV0dXJuIGU+PTY1JiZlPD05MHx8ZT49OTcmJmU8PTEyMnx8ZT49MTI4JiYheS5iaW5hcnlfb3BzW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldfHx5LmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5oYXMoU3RyaW5nLmZyb21DaGFyQ29kZShlKSl9c3RhdGljIGlzSWRlbnRpZmllclBhcnQoZSl7cmV0dXJuIHkuaXNJZGVudGlmaWVyU3RhcnQoZSl8fHkuaXNEZWNpbWFsRGlnaXQoZSl9dGhyb3dFcnJvcihlKXtjb25zdCBuPW5ldyBFcnJvcihlKyIgYXQgY2hhcmFjdGVyICIrdGhpcy5pbmRleCk7dGhyb3cgbi5pbmRleD10aGlzLmluZGV4LG4uZGVzY3JpcHRpb249ZSxufXJ1bkhvb2soZSxuKXtpZih5Lmhvb2tzW2VdKXtjb25zdCByPXtjb250ZXh0OnRoaXMsbm9kZTpufTtyZXR1cm4geS5ob29rcy5ydW4oZSxyKSxyLm5vZGV9cmV0dXJuIG59c2VhcmNoSG9vayhlKXtpZih5Lmhvb2tzW2VdKXtjb25zdCBuPXtjb250ZXh0OnRoaXN9O3JldHVybiB5Lmhvb2tzW2VdLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2FsbChuLmNvbnRleHQsbiksbi5ub2RlfSksbi5ub2RlfX1nb2JibGVTcGFjZXMoKXtsZXQgZT10aGlzLmNvZGU7Zm9yKDtlPT09eS5TUEFDRV9DT0RFfHxlPT09eS5UQUJfQ09ERXx8ZT09PXkuTEZfQ09ERXx8ZT09PXkuQ1JfQ09ERTspZT10aGlzLmV4cHIuY2hhckNvZGVBdCgrK3RoaXMuaW5kZXgpO3RoaXMucnVuSG9vaygiZ29iYmxlLXNwYWNlcyIpfXBhcnNlKCl7dGhpcy5ydW5Ib29rKCJiZWZvcmUtYWxsIik7Y29uc3QgZT10aGlzLmdvYmJsZUV4cHJlc3Npb25zKCksbj1lLmxlbmd0aD09PTE/ZVswXTp7dHlwZTp5LkNPTVBPVU5ELGJvZHk6ZX07cmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItYWxsIixuKX1nb2JibGVFeHByZXNzaW9ucyhlKXtsZXQgbj1bXSxyLGk7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KWlmKHI9dGhpcy5jb2RlLHI9PT15LlNFTUNPTF9DT0RFfHxyPT09eS5DT01NQV9DT0RFKXRoaXMuaW5kZXgrKztlbHNlIGlmKGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCkpbi5wdXNoKGkpO2Vsc2UgaWYodGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoKXtpZihyPT09ZSlicmVhazt0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgIicrdGhpcy5jaGFyKyciJyl9cmV0dXJuIG59Z29iYmxlRXhwcmVzc2lvbigpe2NvbnN0IGU9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtZXhwcmVzc2lvbiIpfHx0aGlzLmdvYmJsZUJpbmFyeUV4cHJlc3Npb24oKTtyZXR1cm4gdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLnJ1bkhvb2soImFmdGVyLWV4cHJlc3Npb24iLGUpfWdvYmJsZUJpbmFyeU9wKCl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgZT10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgseS5tYXhfYmlub3BfbGVuKSxuPWUubGVuZ3RoO2Zvcig7bj4wOyl7aWYoeS5iaW5hcnlfb3BzLmhhc093blByb3BlcnR5KGUpJiYoIXkuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlKXx8dGhpcy5pbmRleCtlLmxlbmd0aDx0aGlzLmV4cHIubGVuZ3RoJiYheS5pc0lkZW50aWZpZXJQYXJ0KHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrZS5sZW5ndGgpKSkpcmV0dXJuIHRoaXMuaW5kZXgrPW4sZTtlPWUuc3Vic3RyKDAsLS1uKX1yZXR1cm4hMX1nb2JibGVCaW5hcnlFeHByZXNzaW9uKCl7bGV0IGUsbixyLGksbyxzLGgsYSxmO2lmKHM9dGhpcy5nb2JibGVUb2tlbigpLCFzfHwobj10aGlzLmdvYmJsZUJpbmFyeU9wKCksIW4pKXJldHVybiBzO2ZvcihvPXt2YWx1ZTpuLHByZWM6eS5iaW5hcnlQcmVjZWRlbmNlKG4pLHJpZ2h0X2E6eS5yaWdodF9hc3NvY2lhdGl2ZS5oYXMobil9LGg9dGhpcy5nb2JibGVUb2tlbigpLGh8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK24pLGk9W3MsbyxoXTtuPXRoaXMuZ29iYmxlQmluYXJ5T3AoKTspe2lmKHI9eS5iaW5hcnlQcmVjZWRlbmNlKG4pLHI9PT0wKXt0aGlzLmluZGV4LT1uLmxlbmd0aDticmVha31vPXt2YWx1ZTpuLHByZWM6cixyaWdodF9hOnkucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSxmPW47Y29uc3QgZD1fPT5vLnJpZ2h0X2EmJl8ucmlnaHRfYT9yPl8ucHJlYzpyPD1fLnByZWM7Zm9yKDtpLmxlbmd0aD4yJiZkKGlbaS5sZW5ndGgtMl0pOyloPWkucG9wKCksbj1pLnBvcCgpLnZhbHVlLHM9aS5wb3AoKSxlPXt0eXBlOnkuQklOQVJZX0VYUCxvcGVyYXRvcjpuLGxlZnQ6cyxyaWdodDpofSxpLnB1c2goZSk7ZT10aGlzLmdvYmJsZVRva2VuKCksZXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIGFmdGVyICIrZiksaS5wdXNoKG8sZSl9Zm9yKGE9aS5sZW5ndGgtMSxlPWlbYV07YT4xOyllPXt0eXBlOnkuQklOQVJZX0VYUCxvcGVyYXRvcjppW2EtMV0udmFsdWUsbGVmdDppW2EtMl0scmlnaHQ6ZX0sYS09MjtyZXR1cm4gZX1nb2JibGVUb2tlbigpe2xldCBlLG4scixpO2lmKHRoaXMuZ29iYmxlU3BhY2VzKCksaT10aGlzLnNlYXJjaEhvb2soImdvYmJsZS10b2tlbiIpLGkpcmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpO2lmKGU9dGhpcy5jb2RlLHkuaXNEZWNpbWFsRGlnaXQoZSl8fGU9PT15LlBFUklPRF9DT0RFKXJldHVybiB0aGlzLmdvYmJsZU51bWVyaWNMaXRlcmFsKCk7aWYoZT09PXkuU1FVT1RFX0NPREV8fGU9PT15LkRRVU9URV9DT0RFKWk9dGhpcy5nb2JibGVTdHJpbmdMaXRlcmFsKCk7ZWxzZSBpZihlPT09eS5PQlJBQ0tfQ09ERSlpPXRoaXMuZ29iYmxlQXJyYXkoKTtlbHNle2ZvcihuPXRoaXMuZXhwci5zdWJzdHIodGhpcy5pbmRleCx5Lm1heF91bm9wX2xlbikscj1uLmxlbmd0aDtyPjA7KXtpZih5LnVuYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShuKSYmKCF5LmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrbi5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIXkuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K24ubGVuZ3RoKSkpKXt0aGlzLmluZGV4Kz1yO2NvbnN0IG89dGhpcy5nb2JibGVUb2tlbigpO3JldHVybiBvfHx0aGlzLnRocm93RXJyb3IoIm1pc3NpbmcgdW5hcnlPcCBhcmd1bWVudCIpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLHt0eXBlOnkuVU5BUllfRVhQLG9wZXJhdG9yOm4sYXJndW1lbnQ6byxwcmVmaXg6ITB9KX1uPW4uc3Vic3RyKDAsLS1yKX15LmlzSWRlbnRpZmllclN0YXJ0KGUpPyhpPXRoaXMuZ29iYmxlSWRlbnRpZmllcigpLHkubGl0ZXJhbHMuaGFzT3duUHJvcGVydHkoaS5uYW1lKT9pPXt0eXBlOnkuTElURVJBTCx2YWx1ZTp5LmxpdGVyYWxzW2kubmFtZV0scmF3OmkubmFtZX06aS5uYW1lPT09eS50aGlzX3N0ciYmKGk9e3R5cGU6eS5USElTX0VYUH0pKTplPT09eS5PUEFSRU5fQ09ERSYmKGk9dGhpcy5nb2JibGVHcm91cCgpKX1yZXR1cm4gaT8oaT10aGlzLmdvYmJsZVRva2VuUHJvcGVydHkoaSksdGhpcy5ydW5Ib29rKCJhZnRlci10b2tlbiIsaSkpOnRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLCExKX1nb2JibGVUb2tlblByb3BlcnR5KGUpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IG49dGhpcy5jb2RlO2Zvcig7bj09PXkuUEVSSU9EX0NPREV8fG49PT15Lk9CUkFDS19DT0RFfHxuPT09eS5PUEFSRU5fQ09ERXx8bj09PXkuUVVNQVJLX0NPREU7KXtsZXQgcjtpZihuPT09eS5RVU1BUktfQ09ERSl7aWYodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKSE9PXkuUEVSSU9EX0NPREUpYnJlYWs7cj0hMCx0aGlzLmluZGV4Kz0yLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9dGhpcy5pbmRleCsrLG49PT15Lk9CUkFDS19DT0RFPyhlPXt0eXBlOnkuTUVNQkVSX0VYUCxjb21wdXRlZDohMCxvYmplY3Q6ZSxwcm9wZXJ0eTp0aGlzLmdvYmJsZUV4cHJlc3Npb24oKX0sZS5wcm9wZXJ0eXx8dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PXkuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PXkuT1BBUkVOX0NPREU/ZT17dHlwZTp5LkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyh5LkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT15LlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6eS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDt5LmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT15LlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7eS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO3kuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO3kuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUseS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT15LlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PXkuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6eS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOnkuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2Zvcih5LmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLHkuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTp5LklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT15LkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09eS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PXkuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT15LkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT15LkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoeS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09eS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOnkuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTp5LkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyh5LkNCUkFDS19DT0RFKX19fTtjb25zdCBIdT1uZXcgV3U7T2JqZWN0LmFzc2lnbihTdCx7aG9va3M6SHUscGx1Z2luczpuZXcgenUoU3QpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiPz8iOjEsIiYmIjoyLCJ8IjozLCJeIjo0LCImIjo1LCI9PSI6NiwiIT0iOjYsIj09PSI6NiwiIT09Ijo2LCI8Ijo3LCI+Ijo3LCI8PSI6NywiPj0iOjcsIjw8Ijo4LCI+PiI6OCwiPj4+Ijo4LCIrIjo5LCItIjo5LCIqIjoxMCwiLyI6MTAsIiUiOjEwLCIqKiI6MTF9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQoWyIqKiJdKSxhZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnM6bmV3IFNldChbIiQiLCJfIl0pLGxpdGVyYWxzOnt0cnVlOiEwLGZhbHNlOiExLG51bGw6bnVsbH0sdGhpc19zdHI6InRoaXMifSksU3QubWF4X3Vub3BfbGVuPVN0LmdldE1heEtleUxlbihTdC51bmFyeV9vcHMpLFN0Lm1heF9iaW5vcF9sZW49U3QuZ2V0TWF4S2V5TGVuKFN0LmJpbmFyeV9vcHMpO2NvbnN0IFF0PXQ9Pm5ldyBTdCh0KS5wYXJzZSgpLHF1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNsYXNze30pO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN0KS5maWx0ZXIodD0+IXF1LmluY2x1ZGVzKHQpJiZRdFt0XT09PXZvaWQgMCkuZm9yRWFjaCh0PT57UXRbdF09U3RbdF19KSxRdC5Kc2VwPVN0O2NvbnN0IEt1PSJDb25kaXRpb25hbEV4cHJlc3Npb24iO3ZhciBZdT17bmFtZToidGVybmFyeSIsaW5pdCh0KXt0Lmhvb2tzLmFkZCgiYWZ0ZXItZXhwcmVzc2lvbiIsZnVuY3Rpb24obil7aWYobi5ub2RlJiZ0aGlzLmNvZGU9PT10LlFVTUFSS19DT0RFKXt0aGlzLmluZGV4Kys7Y29uc3Qgcj1uLm5vZGUsaT10aGlzLmdvYmJsZUV4cHJlc3Npb24oKTtpZihpfHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24iKSx0aGlzLmdvYmJsZVNwYWNlcygpLHRoaXMuY29kZT09PXQuQ09MT05fQ09ERSl7dGhpcy5pbmRleCsrO2NvbnN0IG89dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7aWYob3x8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIiksbi5ub2RlPXt0eXBlOkt1LHRlc3Q6cixjb25zZXF1ZW50OmksYWx0ZXJuYXRlOm99LHIub3BlcmF0b3ImJnQuYmluYXJ5X29wc1tyLm9wZXJhdG9yXTw9Ljkpe2xldCBzPXI7Zm9yKDtzLnJpZ2h0Lm9wZXJhdG9yJiZ0LmJpbmFyeV9vcHNbcy5yaWdodC5vcGVyYXRvcl08PS45OylzPXMucmlnaHQ7bi5ub2RlLnRlc3Q9cy5yaWdodCxzLnJpZ2h0PW4ubm9kZSxuLm5vZGU9cn19ZWxzZSB0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIDoiKX19KX19O1F0LnBsdWdpbnMucmVnaXN0ZXIoWXUpO3ZhciBGPSh0PT4odFt0LlZBUklBQkxFPTBdPSJWQVJJQUJMRSIsdFt0LlVOQVJZPTFdPSJVTkFSWSIsdFt0LkJJTkFSWT0yXT0iQklOQVJZIix0W3QuVEVSTkFSWT0zXT0iVEVSTkFSWSIsdFt0LkNPTkRJVElPTkFMPTRdPSJDT05ESVRJT05BTCIsdFt0Lk1FTUJFUj01XT0iTUVNQkVSIix0W3QuRlVOQ1RJT05fQ0FMTD02XT0iRlVOQ1RJT05fQ0FMTCIsdFt0LkFSUkFZPTddPSJBUlJBWSIsdFt0LlJFR0VYPThdPSJSRUdFWCIsdFt0LlZBUklBQkxFX0lOX1NUUklORz05XT0iVkFSSUFCTEVfSU5fU1RSSU5HIix0W3QuTElURVJBTF9OVUxMPTEwXT0iTElURVJBTF9OVUxMIix0W3QuTElURVJBTF9CT09MRUFOPTExXT0iTElURVJBTF9CT09MRUFOIix0W3QuTElURVJBTF9OVU1CRVI9MTJdPSJMSVRFUkFMX05VTUJFUiIsdFt0LkxJVEVSQUxfU1RSSU5HPTEzXT0iTElURVJBTF9TVFJJTkciLHRbdC5MSVRFUkFMX0NPTE9SPTE0XT0iTElURVJBTF9DT0xPUiIsdFt0LkxJVEVSQUxfVkVDVE9SPTE1XT0iTElURVJBTF9WRUNUT1IiLHRbdC5MSVRFUkFMX1JFR0VYPTE2XT0iTElURVJBTF9SRUdFWCIsdFt0LkxJVEVSQUxfVU5ERUZJTkVEPTE3XT0iTElURVJBTF9VTkRFRklORUQiLHRbdC5CVUlMVElOX1ZBUklBQkxFPTE4XT0iQlVJTFRJTl9WQVJJQUJMRSIsdCkpKEZ8fHt9KTtjb25zdCBadT1bIiEiLCItIiwiKyJdLFF1PVsiKyIsIi0iLCIqIiwiLyIsIiUiLCI9PT0iLCIhPT0iLCI+IiwiPj0iLCI8IiwiPD0iLCImJiIsInx8IiwiIX4iLCI9fiIsIj09IiwiIT0iXSxKdT0vXFwvZyx0Zj0iQCMlIixlZj0vQCMlL2csbmY9L14jKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pKFswLTlhLWZdKT8kL2kscmY9L14jKFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pKFswLTlhLWZdezJ9KT8kL2ksZ2k9e0FMSUNFQkxVRToiI0YwRjhGRiIsQU5USVFVRVdISVRFOiIjRkFFQkQ3IixBUVVBOiIjMDBGRkZGIixBUVVBTUFSSU5FOiIjN0ZGRkQ0IixBWlVSRToiI0YwRkZGRiIsQkVJR0U6IiNGNUY1REMiLEJJU1FVRToiI0ZGRTRDNCIsQkxBQ0s6IiMwMDAwMDAiLEJMQU5DSEVEQUxNT05EOiIjRkZFQkNEIixCTFVFOiIjMDAwMEZGIixCTFVFVklPTEVUOiIjOEEyQkUyIixCUk9XTjoiI0E1MkEyQSIsQlVSTFlXT09EOiIjREVCODg3IixDQURFVEJMVUU6IiM1RjlFQTAiLENIQVJUUkVVU0U6IiM3RkZGMDAiLENIT0NPTEFURToiI0QyNjkxRSIsQ09SQUw6IiNGRjdGNTAiLENPUk5GTE9XRVJCTFVFOiIjNjQ5NUVEIixDT1JOU0lMSzoiI0ZGRjhEQyIsQ1JJTVNPTjoiI0RDMTQzQyIsQ1lBTjoiIzAwRkZGRiIsREFSS0JMVUU6IiMwMDAwOEIiLERBUktDWUFOOiIjMDA4QjhCIixEQVJLR09MREVOUk9EOiIjQjg4NjBCIixEQVJLR1JBWToiI0E5QTlBOSIsREFSS0dSRUVOOiIjMDA2NDAwIixEQVJLR1JFWToiI0E5QTlBOSIsREFSS0tIQUtJOiIjQkRCNzZCIixEQVJLTUFHRU5UQToiIzhCMDA4QiIsREFSS09MSVZFR1JFRU46IiM1NTZCMkYiLERBUktPUkFOR0U6IiNGRjhDMDAiLERBUktPUkNISUQ6IiM5OTMyQ0MiLERBUktSRUQ6IiM4QjAwMDAiLERBUktTQUxNT046IiNFOTk2N0EiLERBUktTRUFHUkVFTjoiIzhGQkM4RiIsREFSS1NMQVRFQkxVRToiIzQ4M0Q4QiIsREFSS1NMQVRFR1JBWToiIzJGNEY0RiIsREFSS1NMQVRFR1JFWToiIzJGNEY0RiIsREFSS1RVUlFVT0lTRToiIzAwQ0VEMSIsREFSS1ZJT0xFVDoiIzk0MDBEMyIsREVFUFBJTks6IiNGRjE0OTMiLERFRVBTS1lCTFVFOiIjMDBCRkZGIixESU1HUkFZOiIjNjk2OTY5IixESU1HUkVZOiIjNjk2OTY5IixET0RHRVJCTFVFOiIjMUU5MEZGIixGSVJFQlJJQ0s6IiNCMjIyMjIiLEZMT1JBTFdISVRFOiIjRkZGQUYwIixGT1JFU1RHUkVFTjoiIzIyOEIyMiIsRlVDSFNJQToiI0ZGMDBGRiIsR0FJTlNCT1JPOiIjRENEQ0RDIixHSE9TVFdISVRFOiIjRjhGOEZGIixHT0xEOiIjRkZENzAwIixHT0xERU5ST0Q6IiNEQUE1MjAiLEdSQVk6IiM4MDgwODAiLEdSRUVOOiIjMDA4MDAwIixHUkVFTllFTExPVzoiI0FERkYyRiIsR1JFWToiIzgwODA4MCIsSE9ORVlERVc6IiNGMEZGRjAiLEhPVFBJTks6IiNGRjY5QjQiLElORElBTlJFRDoiI0NENUM1QyIsSU5ESUdPOiIjNEIwMDgyIixJVk9SWToiI0ZGRkZGMCIsS0hBS0k6IiNGMEU2OEMiLExBVkVOREVSOiIjRTZFNkZBIixMQVZFTkRBUl9CTFVTSDoiI0ZGRjBGNSIsTEFXTkdSRUVOOiIjN0NGQzAwIixMRU1PTkNISUZGT046IiNGRkZBQ0QiLExJR0hUQkxVRToiI0FERDhFNiIsTElHSFRDT1JBTDoiI0YwODA4MCIsTElHSFRDWUFOOiIjRTBGRkZGIixMSUdIVEdPTERFTlJPRFlFTExPVzoiI0ZBRkFEMiIsTElHSFRHUkFZOiIjRDNEM0QzIixMSUdIVEdSRUVOOiIjOTBFRTkwIixMSUdIVEdSRVk6IiNEM0QzRDMiLExJR0hUUElOSzoiI0ZGQjZDMSIsTElHSFRTRUFHUkVFTjoiIzIwQjJBQSIsTElHSFRTS1lCTFVFOiIjODdDRUZBIixMSUdIVFNMQVRFR1JBWToiIzc3ODg5OSIsTElHSFRTTEFURUdSRVk6IiM3Nzg4OTkiLExJR0hUU1RFRUxCTFVFOiIjQjBDNERFIixMSUdIVFlFTExPVzoiI0ZGRkZFMCIsTElNRToiIzAwRkYwMCIsTElNRUdSRUVOOiIjMzJDRDMyIixMSU5FTjoiI0ZBRjBFNiIsTUFHRU5UQToiI0ZGMDBGRiIsTUFST09OOiIjODAwMDAwIixNRURJVU1BUVVBTUFSSU5FOiIjNjZDREFBIixNRURJVU1CTFVFOiIjMDAwMENEIixNRURJVU1PUkNISUQ6IiNCQTU1RDMiLE1FRElVTVBVUlBMRToiIzkzNzBEQiIsTUVESVVNU0VBR1JFRU46IiMzQ0IzNzEiLE1FRElVTVNMQVRFQkxVRToiIzdCNjhFRSIsTUVESVVNU1BSSU5HR1JFRU46IiMwMEZBOUEiLE1FRElVTVRVUlFVT0lTRToiIzQ4RDFDQyIsTUVESVVNVklPTEVUUkVEOiIjQzcxNTg1IixNSUROSUdIVEJMVUU6IiMxOTE5NzAiLE1JTlRDUkVBTToiI0Y1RkZGQSIsTUlTVFlST1NFOiIjRkZFNEUxIixNT0NDQVNJTjoiI0ZGRTRCNSIsTkFWQUpPV0hJVEU6IiNGRkRFQUQiLE5BVlk6IiMwMDAwODAiLE9MRExBQ0U6IiNGREY1RTYiLE9MSVZFOiIjODA4MDAwIixPTElWRURSQUI6IiM2QjhFMjMiLE9SQU5HRToiI0ZGQTUwMCIsT1JBTkdFUkVEOiIjRkY0NTAwIixPUkNISUQ6IiNEQTcwRDYiLFBBTEVHT0xERU5ST0Q6IiNFRUU4QUEiLFBBTEVHUkVFTjoiIzk4RkI5OCIsUEFMRVRVUlFVT0lTRToiI0FGRUVFRSIsUEFMRVZJT0xFVFJFRDoiI0RCNzA5MyIsUEFQQVlBV0hJUDoiI0ZGRUZENSIsUEVBQ0hQVUZGOiIjRkZEQUI5IixQRVJVOiIjQ0Q4NTNGIixQSU5LOiIjRkZDMENCIixQTFVNOiIjRERBMEREIixQT1dERVJCTFVFOiIjQjBFMEU2IixQVVJQTEU6IiM4MDAwODAiLFJFRDoiI0ZGMDAwMCIsUk9TWUJST1dOOiIjQkM4RjhGIixST1lBTEJMVUU6IiM0MTY5RTEiLFNBRERMRUJST1dOOiIjOEI0NTEzIixTQUxNT046IiNGQTgwNzIiLFNBTkRZQlJPV046IiNGNEE0NjAiLFNFQUdSRUVOOiIjMkU4QjU3IixTRUFTSEVMTDoiI0ZGRjVFRSIsU0lFTk5BOiIjQTA1MjJEIixTSUxWRVI6IiNDMEMwQzAiLFNLWUJMVUU6IiM4N0NFRUIiLFNMQVRFQkxVRToiIzZBNUFDRCIsU0xBVEVHUkFZOiIjNzA4MDkwIixTTEFURUdSRVk6IiM3MDgwOTAiLFNOT1c6IiNGRkZBRkEiLFNQUklOR0dSRUVOOiIjMDBGRjdGIixTVEVFTEJMVUU6IiM0NjgyQjQiLFRBTjoiI0QyQjQ4QyIsVEVBTDoiIzAwODA4MCIsVEhJU1RMRToiI0Q4QkZEOCIsVE9NQVRPOiIjRkY2MzQ3IixUVVJRVU9JU0U6IiM0MEUwRDAiLFZJT0xFVDoiI0VFODJFRSIsV0hFQVQ6IiNGNURFQjMiLFdISVRFOiIjRkZGRkZGIixXSElURVNNT0tFOiIjRjVGNUY1IixZRUxMT1c6IiNGRkZGMDAiLFlFTExPV0dSRUVOOiIjOUFDRDMyIn07ZnVuY3Rpb24gb2YodCl7Y29uc3QgZT1Zblt0XTtyZXR1cm4gZnVuY3Rpb24obil7Y29uc3Qgcj10aGlzLl9sZWZ0LmV2YWx1YXRlKG4pLGk9dGhpcy5fcmlnaHQuZXZhbHVhdGUobik7cmV0dXJuIGUodCxyLGkpfX1jb25zdCBZbj17YXRhbjI6R2UoTWF0aC5hdGFuMiwhMSkscG93OkdlKE1hdGgucG93LCExKSxtaW46R2UoTWF0aC5taW4sITApLG1heDpHZShNYXRoLm1heCwhMCksc3RhcnRzV2l0aDpHZShzZiwhMSl9O2Z1bmN0aW9uIEdlKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXtpZihlJiZ0eXBlb2YgaT09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyInx8dHlwZW9mIHI9PSJudW1iZXIiJiZ0eXBlb2YgaT09Im51bWJlciJ8fHR5cGVvZiByPT0ic3RyaW5nIiYmdHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiB0KHIsaSk7dGhyb3cgbmV3IEVycm9yKGBGdW5jdGlvbiAiJHtufSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtyfSBhbmQgJHtpfS5gKX19ZnVuY3Rpb24gc2YodCxlKXtyZXR1cm4gdC5zdGFydHNXaXRoKGUpfWZ1bmN0aW9uIGFmKHQpe2NvbnN0IGU9Wm5bdF07cmV0dXJuIGZ1bmN0aW9uKG4pe2NvbnN0IHI9dGhpcy5fbGVmdC5ldmFsdWF0ZShuKTtyZXR1cm4gZSh0LHIpfX1jb25zdCBabj17YWJzOnV0KE1hdGguYWJzKSxzcXJ0OnV0KE1hdGguc3FydCksY29zOnV0KE1hdGguY29zKSxzaW46dXQoTWF0aC5zaW4pLHRhbjp1dChNYXRoLnRhbiksYWNvczp1dChNYXRoLmFjb3MpLGFzaW46dXQoTWF0aC5hc2luKSxhdGFuOnV0KE1hdGguYXRhbikscmFkaWFuczp1dChSLnRvUmFkaWFucyksZGVncmVlczp1dChSLnRvRGVncmVlcyksc2lnbjp1dChSLnNpZ24pLGZsb29yOnV0KE1hdGguZmxvb3IpLGNlaWw6dXQoTWF0aC5jZWlsKSxyb3VuZDp1dChNYXRoLnJvdW5kKSxleHAyOnV0KGNmKSxsb2c6dXQoTWF0aC5sb2cpLGxvZzI6dXQodWYpLGZyYWN0OnV0KGhmKX07ZnVuY3Rpb24gdXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7aWYodHlwZW9mIG49PSJudW1iZXIiKXJldHVybiB0KG4pO3Rocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gIiR7ZX0iIHJlcXVpcmVzIGEgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudC4gQXJndW1lbnQgaXMgJHtufS5gKX19ZnVuY3Rpb24gaGYodCl7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX1mdW5jdGlvbiBjZih0KXtyZXR1cm4gTWF0aC5wb3coMix0KX1mdW5jdGlvbiB1Zih0KXtyZXR1cm4gUi5sb2cyKHQpfWNvbnN0IGZmPS9ecmdiYT9cKFxzKihbMC05Ll0rJT8pXHMqLFxzKihbMC05Ll0rJT8pXHMqLFxzKihbMC05Ll0rJT8pKD86XHMqLFxzKihbMC05Ll0rKSk/XHMqXCkkL2ksbGY9L15oc2xhP1woXHMqKFswLTkuXSspXHMqLFxzKihbMC05Ll0rJSlccyosXHMqKFswLTkuXSslKSg/OlxzKixccyooWzAtOS5dKykpP1xzKlwpJC9pO2NsYXNzIHR0e2NvbnN0cnVjdG9yKGUsbixyLGkpe0wodGhpcywicmVkIik7TCh0aGlzLCJncmVlbiIpO0wodGhpcywiYmx1ZSIpO0wodGhpcywiYWxwaGEiKTt0aGlzLnJlZD1kdChlLDEpLHRoaXMuZ3JlZW49ZHQobiwxKSx0aGlzLmJsdWU9ZHQociwxKSx0aGlzLmFscGhhPWR0KGksMSl9c3RhdGljIGJ5dGVUb0Zsb2F0KGUpe3JldHVybiBlLzI1NX1zdGF0aWMgZmxvYXRUb0J5dGUoZSl7cmV0dXJuIGU9PT0xPzI1NTplKjI1NnwwfXN0YXRpYyBmcm9tQ3NzQ29sb3JTdHJpbmcoZSl7ZT1lLnJlcGxhY2UoL1xzL2csIiIpO2NvbnN0IG49ZGYoZSk7aWYodHlwZW9mIG48InUiKXJldHVybiBuO2xldCByPW5mLmV4ZWMoZSk7aWYociE9PW51bGwpe2NvbnN0IGk9bmV3IHR0O3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8xNSxpLmdyZWVuPXBhcnNlSW50KHJbMl0sMTYpLzE1LGkuYmx1ZT1wYXJzZUludChyWzNdLDE2KS8xNSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImYiKSwxNikvMTUsaX1pZihyPXJmLmV4ZWMoZSksciE9PW51bGwpe2NvbnN0IGk9bmV3IHR0O3JldHVybiBpLnJlZD1wYXJzZUludChyWzFdLDE2KS8yNTUsaS5ncmVlbj1wYXJzZUludChyWzJdLDE2KS8yNTUsaS5ibHVlPXBhcnNlSW50KHJbM10sMTYpLzI1NSxpLmFscGhhPXBhcnNlSW50KGR0KHJbNF0sImZmIiksMTYpLzI1NSxpfWlmKHI9ZmYuZXhlYyhlKSxyIT09bnVsbCl7Y29uc3QgaT1uZXcgdHQ7cmV0dXJuIGkucmVkPXBhcnNlRmxvYXQoclsxXSkvKHJbMV0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmdyZWVuPXBhcnNlRmxvYXQoclsyXSkvKHJbMl0uc3Vic3RyKC0xKT09PSIlIj8xMDA6MjU1KSxpLmJsdWU9cGFyc2VGbG9hdChyWzNdKS8oclszXS5zdWJzdHIoLTEpPT09IiUiPzEwMDoyNTUpLGkuYWxwaGE9cGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSksaX1pZihyPWxmLmV4ZWMoZSksciE9PW51bGwpcmV0dXJuIHR0LmZyb21Ic2wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAscGFyc2VGbG9hdChkdChyWzRdLCIxLjAiKSkpfXN0YXRpYyBmcm9tSHNsKGUsbixyLGkpe2lmKGU9ZHQoZSwwKSUxLG49ZHQobiwwKSxyPWR0KHIsMCksaT1kdChpLDEpLGUmJm4mJnImJmkpe2xldCBvPXIscz1yLGg9cjtjb25zdCBhPW5ldyB0dDtpZihuIT09MCl7bGV0IGY7cjwuNT9mPXIqKDErbik6Zj1yK24tcipuO2NvbnN0IGQ9MipyLWY7bz1RbihkLGYsZSsxLzMpLHM9UW4oZCxmLGUpLGg9UW4oZCxmLGUtMS8zKX1yZXR1cm4gdHlwZW9mIGE+InUiP25ldyB0dChvLHMsaCxpKTooYS5yZWQ9byxhLmdyZWVuPXMsYS5ibHVlPWgsYS5hbHBoYT1pLGEpfX10b0Nzc0hleFN0cmluZygpe2xldCBlPXR0LmZsb2F0VG9CeXRlKHRoaXMucmVkKS50b1N0cmluZygxNik7ZS5sZW5ndGg8MiYmKGU9YDAke2V9YCk7bGV0IG49dHQuZmxvYXRUb0J5dGUodGhpcy5ncmVlbikudG9TdHJpbmcoMTYpO24ubGVuZ3RoPDImJihuPWAwJHtufWApO2xldCByPXR0LmZsb2F0VG9CeXRlKHRoaXMuYmx1ZSkudG9TdHJpbmcoMTYpO2lmKHIubGVuZ3RoPDImJihyPWAwJHtyfWApLHRoaXMuYWxwaGE8MSl7bGV0IGk9dHQuZmxvYXRUb0J5dGUodGhpcy5hbHBoYSkudG9TdHJpbmcoMTYpO3JldHVybiBpLmxlbmd0aDwyJiYoaT1gMCR7aX1gKSxgIyR7ZX0ke259JHtyfSR7aX1gfXJldHVybmAjJHtlfSR7bn0ke3J9YC50b1VwcGVyQ2FzZSgpfXN0YXRpYyBmcm9tQnl0ZXMoZSxuLHIsaSl7cmV0dXJuIGU9dGhpcy5ieXRlVG9GbG9hdChkdChlLDI1NSkpLG49dHQuYnl0ZVRvRmxvYXQoZHQobiwyNTUpKSxyPXR0LmJ5dGVUb0Zsb2F0KGR0KHIsMjU1KSksaT10dC5ieXRlVG9GbG9hdChkdChpLDI1NSkpLG5ldyB0dChlLG4scixpKX19ZnVuY3Rpb24gZGYodCl7aWYodD10LnRvVXBwZXJDYXNlKCksZ2lbdF0pcmV0dXJuIHR0LmZyb21Dc3NDb2xvclN0cmluZyhnaVt0XSk7c3dpdGNoKHQpe2Nhc2UiVFJBTlNQQVJFTlQiOnJldHVybiBuZXcgdHQoMCwwLDAsMCk7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIFFuKHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbio2PDE/dCsoZS10KSo2Km46bioyPDE/ZTpuKjM8Mj90KyhlLXQpKigyLzMtbikqNjp0fWNsYXNzIER7Y29uc3RydWN0b3IoZSxuLHIsaSxvKXtMKHRoaXMsIl90eXBlIik7TCh0aGlzLCJfdmFsdWUiKTtMKHRoaXMsIl9sZWZ0Iik7TCh0aGlzLCJfcmlnaHQiKTtMKHRoaXMsIl90ZXN0Iik7TCh0aGlzLCJldmFsdWF0ZSIpO3RoaXMuX3R5cGU9ZSx0aGlzLl92YWx1ZT1uLHRoaXMuX2xlZnQ9cix0aGlzLl9yaWdodD1pLHRoaXMuX3Rlc3Q9byx0aGlzLnNldEV2YWx1YXRlRnVuY3Rpb24oKX1zZXRFdmFsdWF0ZUZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLl90eXBlLG49dGhpcy5fdmFsdWU7c3dpdGNoKGUpe2Nhc2UgRi5DT05ESVRJT05BTDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uYWw7YnJlYWs7Y2FzZSBGLkZVTkNUSU9OX0NBTEw6c3dpdGNoKG4pe2Nhc2UidG9TdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVUb1N0cmluZzticmVha31icmVhaztjYXNlIEYuVU5BUlk6c3dpdGNoKG4pe2Nhc2UiISI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdDticmVhaztjYXNlIi0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOZWdhdGl2ZTticmVhaztjYXNlIisiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVQb3NpdGl2ZTticmVhaztjYXNlImlzTmFOIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTmFOO2JyZWFrO2Nhc2UiaXNGaW5pdGUiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVJc0Zpbml0ZTticmVhaztjYXNlIkJvb2xlYW4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVCb29sZWFuQ29udmVyc2lvbjticmVhaztjYXNlIk51bWJlciI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb247YnJlYWs7Y2FzZSJTdHJpbmciOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVTdHJpbmdDb252ZXJzaW9uO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIFpuW25dPCJ1IiYmKHRoaXMuZXZhbHVhdGU9YWYobikpO2JyZWFrfWJyZWFrO2Nhc2UgRi5CSU5BUlk6c3dpdGNoKG4pe2Nhc2UiKyI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZVBsdXM7YnJlYWs7Y2FzZSItIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWludXM7YnJlYWs7Y2FzZSIqIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVGltZXM7YnJlYWs7Y2FzZSIvIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRGl2aWRlO2JyZWFrO2Nhc2UiJSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1vZDticmVhaztjYXNlIj09PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUVxdWFsc1N0cmljdDticmVhaztjYXNlIiE9PSI6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU5vdEVxdWFsc1N0cmljdDticmVhaztjYXNlIjwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVMZXNzVGhhbjticmVhaztjYXNlIjw9Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGVzc1RoYW5PckVxdWFsczticmVhaztjYXNlIj4iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVHcmVhdGVyVGhhbjticmVhaztjYXNlIj49Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlR3JlYXRlclRoYW5PckVxdWFsczticmVhaztjYXNlIiYmIjp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlQW5kO2JyZWFrO2Nhc2UifHwiOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVPcjticmVhaztjYXNlIj09Ijp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlRXF1YWxzO2JyZWFrO2Nhc2UiIT0iOnRoaXMuZXZhbHVhdGU9dGhpcy5fZXZhbHVhdGVOb3RFcXVhbHM7YnJlYWs7ZGVmYXVsdDp0eXBlb2YgWW5bbl08InUiJiYodGhpcy5ldmFsdWF0ZT1vZihuKSk7YnJlYWt9YnJlYWs7Y2FzZSBGLk1FTUJFUjpuPT09ImJyYWNrZXRzIj90aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTWVtYmVyQnJhY2tldHM6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZU1lbWJlckRvdDticmVhaztjYXNlIEYuQVJSQVk6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUFycmF5O2JyZWFrO2Nhc2UgRi5WQVJJQUJMRTp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGU7YnJlYWs7Y2FzZSBGLlZBUklBQkxFX0lOX1NUUklORzp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlVmFyaWFibGVTdHJpbmc7YnJlYWs7Y2FzZSBGLkxJVEVSQUxfQ09MT1I6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxDb2xvcjticmVhaztjYXNlIEYuTElURVJBTF9TVFJJTkc6dGhpcy5ldmFsdWF0ZT10aGlzLl9ldmFsdWF0ZUxpdGVyYWxTdHJpbmc7YnJlYWs7ZGVmYXVsdDp0aGlzLmV2YWx1YXRlPXRoaXMuX2V2YWx1YXRlTGl0ZXJhbDticmVha319X2V2YWx1YXRlTGl0ZXJhbCgpe3JldHVybiB0aGlzLl92YWx1ZX1fZXZhbHVhdGVMaXRlcmFsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfV9ldmFsdWF0ZVZhcmlhYmxlU3RyaW5nKGUpe2NvbnN0IG49L1wkeyguKj8pfS9nO2xldCByPXRoaXMuX3ZhbHVlLGk9bi5leGVjKHIpO2Zvcig7aSE9PW51bGw7KXtjb25zdCBvPWlbMF0scz1pWzFdO2xldCBoPWU9PW51bGw/dm9pZCAwOmUucHJvcGVydGllc1tzXTt0eXBlb2YgaD4idSImJihoPSIiKSxyPXIucmVwbGFjZShvLGgpLGk9bi5leGVjKHIpfXJldHVybiByfV9ldmFsdWF0ZVZhcmlhYmxlKGUpe2xldCBuO3JldHVybiBlJiZTdHJpbmcodGhpcy5fdmFsdWUpaW4gZS5wcm9wZXJ0aWVzP249ZS5wcm9wZXJ0aWVzW1N0cmluZyh0aGlzLl92YWx1ZSldOlN0cmluZyh0aGlzLl92YWx1ZSk9PT0iaWQiP249ZT09bnVsbD92b2lkIDA6ZS5pZDplJiZTdHJpbmcodGhpcy5fdmFsdWUpPT09InJvb3RQcm9wZXJ0aWVzIiYmKG49ZS5wcm9wZXJ0aWVzKSx0eXBlb2Ygbj4idSImJihuPSIiKSxufV9ldmFsdWF0ZU1lbWJlckRvdChlKXtpZihtaSh0aGlzLl9sZWZ0KSlyZXR1cm4gZT09bnVsbD92b2lkIDA6ZS5wcm9wZXJ0aWVzW3RoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpXTtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4+InUiKXJldHVybjtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuW3JdfV9ldmFsdWF0ZU1lbWJlckJyYWNrZXRzKGUpe2lmKG1pKHRoaXMuX2xlZnQpKXJldHVybiBlPT1udWxsP3ZvaWQgMDplLnByb3BlcnRpZXNbdGhpcy5fcmlnaHQuZXZhbHVhdGUoZSldO2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj4idSIpcmV0dXJuO2NvbnN0IHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG5bcl19X2V2YWx1YXRlQXJyYXkoZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX3ZhbHVlLmxlbmd0aDtyKyspbltyXT10aGlzLl92YWx1ZVtyXS5ldmFsdWF0ZShlKTtyZXR1cm4gbn1fZXZhbHVhdGVOb3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiISIgcmVxdWlyZXMgYSBib29sZWFuIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiFufV9ldmFsdWF0ZU5lZ2F0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciIpcmV0dXJuLW47dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApfV9ldmFsdWF0ZVBvc2l0aXZlKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiKyIgcmVxdWlyZXMgYSB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50LiBBcmd1bWVudCBpcyAke259LmApO3JldHVybiBufV9ldmFsdWF0ZUxlc3NUaGFuKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPCIgcmVxdWlyZXMgbnVtYmVyIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApLCExKTpuPHJ9X2V2YWx1YXRlTGVzc1RoYW5PckVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIG4hPSJudW1iZXIifHx0eXBlb2YgciE9Im51bWJlciI/KGNvbnNvbGUud2FybihgT3BlcmF0b3IgIjw9IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm48PXJ9X2V2YWx1YXRlR3JlYXRlclRoYW4oZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyInx8dHlwZW9mIHIhPSJudW1iZXIiPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICI+IiByZXF1aXJlcyBudW1iZXIgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCksITEpOm4+cn1fZXZhbHVhdGVHcmVhdGVyVGhhbk9yRXF1YWxzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgbiE9Im51bWJlciJ8fHR5cGVvZiByIT0ibnVtYmVyIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAiPj0iIHJlcXVpcmVzIG51bWJlciBhcmd1bWVudHMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKSwhMSk6bj49cn1fZXZhbHVhdGVPcihlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG4hPSJib29sZWFuIilyZXR1cm4gY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBGaXJzdCBhcmd1bWVudCBpcyAke259LmApLCExO2lmKG4pcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gdHlwZW9mIHIhPSJib29sZWFuIj8oY29uc29sZS53YXJuKGBPcGVyYXRvciAifHwiIHJlcXVpcmVzIGJvb2xlYW4gYXJndW1lbnRzLiBTZWNvbmQgYXJndW1lbnQgaXMgJHtyfS5gKSwhMSk6bnx8cn1fZXZhbHVhdGVBbmQoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpcmV0dXJuIGNvbnNvbGUud2FybihgT3BlcmF0b3IgIiYmIiByZXF1aXJlcyBib29sZWFuIGFyZ3VtZW50cy4gRmlyc3QgYXJndW1lbnQgaXMgJHtufS5gKSwhMTtpZighbilyZXR1cm4hMTtjb25zdCByPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiB0eXBlb2YgciE9ImJvb2xlYW4iPyhjb25zb2xlLndhcm4oYE9wZXJhdG9yICImJiIgcmVxdWlyZXMgYm9vbGVhbiBhcmd1bWVudHMuIFNlY29uZCBhcmd1bWVudCBpcyAke3J9LmApLCExKTpuJiZyfV9ldmFsdWF0ZVBsdXMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4rcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIrIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYXQgbGVhc3Qgb25lIHN0cmluZyBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1pbnVzKGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO2lmKHR5cGVvZiBuPT0ibnVtYmVyIiYmdHlwZW9mIHI9PSJudW1iZXIiKXJldHVybiBuLXI7dGhyb3cgbmV3IEVycm9yKGBPcGVyYXRvciAiLSIgcmVxdWlyZXMgdmVjdG9yIG9yIG51bWJlciBhcmd1bWVudHMgb2YgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVUaW1lcyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbipyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIioiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgdmVjdG9ycyB0aGV5IG11c3QgYmUgbWF0Y2hpbmcgdHlwZXMuIEFyZ3VtZW50cyBhcmUgJHtufSBhbmQgJHtyfS5gKX1fZXZhbHVhdGVEaXZpZGUoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7aWYodHlwZW9mIG49PSJudW1iZXIiJiZ0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIG4vcjt0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdG9yICIvIiByZXF1aXJlcyB2ZWN0b3Igb3IgbnVtYmVyIGFyZ3VtZW50cyBvZiBtYXRjaGluZyB0eXBlcywgb3IgYSBudW1iZXIgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gQXJndW1lbnRzIGFyZSAke259IGFuZCAke3J9LmApfV9ldmFsdWF0ZU1vZChlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtpZih0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiByPT0ibnVtYmVyIilyZXR1cm4gbiVyO3Rocm93IG5ldyBFcnJvcihgT3BlcmF0b3IgIiUiIHJlcXVpcmVzIHZlY3RvciBvciBudW1iZXIgYXJndW1lbnRzIG9mIG1hdGNoaW5nIHR5cGVzLiBBcmd1bWVudHMgYXJlICR7bn0gYW5kICR7cn0uYCl9X2V2YWx1YXRlRXF1YWxzU3RyaWN0KGUpe2NvbnN0IG49dGhpcy5fbGVmdC5ldmFsdWF0ZShlKSxyPXRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpO3JldHVybiBuPT09cn1fZXZhbHVhdGVOb3RFcXVhbHNTdHJpY3QoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIG4hPT1yfV9ldmFsdWF0ZUNvbmRpdGlvbmFsKGUpe2NvbnN0IG49dGhpcy5fdGVzdC5ldmFsdWF0ZShlKTtpZih0eXBlb2YgbiE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcihgQ29uZGl0aW9uYWwgYXJndW1lbnQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGJlIGEgYm9vbGVhbi4gQXJndW1lbnQgaXMgJHtufS5gKTtyZXR1cm4gbj90aGlzLl9sZWZ0LmV2YWx1YXRlKGUpOnRoaXMuX3JpZ2h0LmV2YWx1YXRlKGUpfV9ldmFsdWF0ZU5hTihlKXtyZXR1cm4gaXNOYU4odGhpcy5fbGVmdC5ldmFsdWF0ZShlKSl9X2V2YWx1YXRlSXNGaW5pdGUoZSl7cmV0dXJuIGlzRmluaXRlKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZUJvb2xlYW5Db252ZXJzaW9uKGUpe3JldHVybiBCb29sZWFuKHRoaXMuX2xlZnQuZXZhbHVhdGUoZSkpfV9ldmFsdWF0ZU51bWJlckNvbnZlcnNpb24oZSl7Y29uc3Qgbj1FZih0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKTtyZXR1cm4gTnVtYmVyKG4pfV9ldmFsdWF0ZVN0cmluZ0NvbnZlcnNpb24oZSl7cmV0dXJuIFN0cmluZyh0aGlzLl9sZWZ0LmV2YWx1YXRlKGUpKX1fZXZhbHVhdGVUb1N0cmluZyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSk7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gU3RyaW5nKG4pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke3RoaXMuX3ZhbHVlfSIuYCl9X2V2YWx1YXRlTGl0ZXJhbENvbG9yKGUpe2NvbnN0IG49dGhpcy5fbGVmdDtsZXQgcj1uZXcgdHQ7aWYodGhpcy5fdmFsdWU9PT0iY29sb3IiKWlmKHR5cGVvZiBuPiJ1IilyPXR0LmZyb21CeXRlcygyNTUsMjU1LDI1NSwyNTUpO2Vsc2UgaWYobi5sZW5ndGg+MSl7Y29uc3QgaT10dC5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCk7ci5hbHBoYT1uWzFdLmV2YWx1YXRlKGUpfWVsc2V7Y29uc3QgaT10dC5mcm9tQ3NzQ29sb3JTdHJpbmcoblswXS5ldmFsdWF0ZShlKSk7aWYoaSlyPWk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYHdyb25nIGxpdGVyYWxDb2xvciBjYWxsICIke3RoaXMuX3ZhbHVlfSwgJHtufX0iYCl9ZWxzZSBpZih0aGlzLl92YWx1ZT09PSJyZ2IiKXI9dHQuZnJvbUJ5dGVzKG5bMF0uZXZhbHVhdGUoZSksblsxXS5ldmFsdWF0ZShlKSxuWzJdLmV2YWx1YXRlKGUpLDI1NSk7ZWxzZSBpZih0aGlzLl92YWx1ZT09PSJyZ2JhIil7Y29uc3QgaT1uWzNdLmV2YWx1YXRlKGUpKjI1NTtyPXR0LmZyb21CeXRlcyhuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSxpKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbCIpe2NvbnN0IGk9dHQuZnJvbUhzbChuWzBdLmV2YWx1YXRlKGUpLG5bMV0uZXZhbHVhdGUoZSksblsyXS5ldmFsdWF0ZShlKSwxKTtpJiYocj1pKX1lbHNlIGlmKHRoaXMuX3ZhbHVlPT09ImhzbGEiKXtjb25zdCBpPXR0LmZyb21Ic2woblswXS5ldmFsdWF0ZShlKSxuWzFdLmV2YWx1YXRlKGUpLG5bMl0uZXZhbHVhdGUoZSksblszXS5ldmFsdWF0ZShlKSk7aSYmKHI9aSl9cmV0dXJuIHIudG9Dc3NIZXhTdHJpbmcoKX1fZXZhbHVhdGVFcXVhbHMoZSl7Y29uc3Qgbj10aGlzLl9sZWZ0LmV2YWx1YXRlKGUpLHI9dGhpcy5fcmlnaHQuZXZhbHVhdGUoZSk7cmV0dXJuIHd0KG4pJiYhd3Qocik/bi5pbmNsdWRlcyhyKTp3dChyKSYmIXd0KG4pP3IuaW5jbHVkZXMobik6KHd0KHIpJiZ3dChuKSYmY29uc29sZS5lcnJvcigiRXF1YWxzIGxlZnQgYW5kIHJpZ2h0IGJvdGggY2FuJ3QgYmUgYXJyYXkgYXQgdGhlIHNhbWUgdGltZSIpLG49PXIpfV9ldmFsdWF0ZU5vdEVxdWFscyhlKXtjb25zdCBuPXRoaXMuX2xlZnQuZXZhbHVhdGUoZSkscj10aGlzLl9yaWdodC5ldmFsdWF0ZShlKTtyZXR1cm4gd3QobikmJiF3dChyKT8hbi5pbmNsdWRlcyhyKTp3dChyKSYmIXd0KG4pPyFyLmluY2x1ZGVzKG4pOih3dChyKSYmd3QobikmJmNvbnNvbGUuZXJyb3IoIk5vdEVxdWFscyBsZWZ0IGFuZCByaWdodCBib3RoIGNhbid0IGJlIGFycmF5IGF0IHRoZSBzYW1lIHRpbWUiKSxuIT1yKX19ZnVuY3Rpb24gRWYodCl7aWYodHlwZW9mIHQhPSJzdHJpbmciKXJldHVybiB0O2NvbnN0IGU9WyIlIl07Zm9yKGNvbnN0IG4gb2YgZSlpZih0LmVuZHNXaXRoKG4pKXJldHVybiB0LnNsaWNlKDAsLW4ubGVuZ3RoKS50cmltKCk7cmV0dXJuIHQudHJpbSgpfWZ1bmN0aW9uIG1pKHQpe3JldHVybiB0Ll92YWx1ZT09PSJmZWF0dXJlIn1mdW5jdGlvbiB3dCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KX1jbGFzcyBfZnthZGQoZSxuLHIpe2lmKHR5cGVvZiBhcmd1bWVudHNbMF0hPSJzdHJpbmciKWZvcihsZXQgaSBpbiBhcmd1bWVudHNbMF0pdGhpcy5hZGQoaSxhcmd1bWVudHNbMF1baV0sYXJndW1lbnRzWzFdKTtlbHNlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goZnVuY3Rpb24oaSl7dGhpc1tpXT10aGlzW2ldfHxbXSxuJiZ0aGlzW2ldW3I/InVuc2hpZnQiOiJwdXNoIl0obil9LHRoaXMpfXJ1bihlLG4pe3RoaXNbZV09dGhpc1tlXXx8W10sdGhpc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IuY2FsbChuJiZuLmNvbnRleHQ/bi5jb250ZXh0Om4sbil9KX19Y2xhc3MgcGZ7Y29uc3RydWN0b3IoZSl7dGhpcy5qc2VwPWUsdGhpcy5yZWdpc3RlcmVkPXt9fXJlZ2lzdGVyKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT1hcmd1bWVudHNbcl07bi5mb3JFYWNoKGk9PntpZih0eXBlb2YgaSE9Im9iamVjdCJ8fCFpLm5hbWV8fCFpLmluaXQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIEpTRVAgcGx1Z2luIGZvcm1hdCIpO3RoaXMucmVnaXN0ZXJlZFtpLm5hbWVdfHwoaS5pbml0KHRoaXMuanNlcCksdGhpcy5yZWdpc3RlcmVkW2kubmFtZV09aSl9KX19Y2xhc3MgRXtzdGF0aWMgZ2V0IHZlcnNpb24oKXtyZXR1cm4iMS40LjAifXN0YXRpYyB0b1N0cmluZygpe3JldHVybiJKYXZhU2NyaXB0IEV4cHJlc3Npb24gUGFyc2VyIChKU0VQKSB2IitFLnZlcnNpb259c3RhdGljIGFkZFVuYXJ5T3AoZSl7cmV0dXJuIEUubWF4X3Vub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLEUubWF4X3Vub3BfbGVuKSxFLnVuYXJ5X29wc1tlXT0xLEV9c3RhdGljIGFkZEJpbmFyeU9wKGUsbixyKXtyZXR1cm4gRS5tYXhfYmlub3BfbGVuPU1hdGgubWF4KGUubGVuZ3RoLEUubWF4X2Jpbm9wX2xlbiksRS5iaW5hcnlfb3BzW2VdPW4scj9FLnJpZ2h0X2Fzc29jaWF0aXZlLmFkZChlKTpFLnJpZ2h0X2Fzc29jaWF0aXZlLmRlbGV0ZShlKSxFfXN0YXRpYyBhZGRJZGVudGlmaWVyQ2hhcihlKXtyZXR1cm4gRS5hZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnMuYWRkKGUpLEV9c3RhdGljIGFkZExpdGVyYWwoZSxuKXtyZXR1cm4gRS5saXRlcmFsc1tlXT1uLEV9c3RhdGljIHJlbW92ZVVuYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSBFLnVuYXJ5X29wc1tlXSxlLmxlbmd0aD09PUUubWF4X3Vub3BfbGVuJiYoRS5tYXhfdW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS51bmFyeV9vcHMpKSxFfXN0YXRpYyByZW1vdmVBbGxVbmFyeU9wcygpe3JldHVybiBFLnVuYXJ5X29wcz17fSxFLm1heF91bm9wX2xlbj0wLEV9c3RhdGljIHJlbW92ZUlkZW50aWZpZXJDaGFyKGUpe3JldHVybiBFLmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5kZWxldGUoZSksRX1zdGF0aWMgcmVtb3ZlQmluYXJ5T3AoZSl7cmV0dXJuIGRlbGV0ZSBFLmJpbmFyeV9vcHNbZV0sZS5sZW5ndGg9PT1FLm1heF9iaW5vcF9sZW4mJihFLm1heF9iaW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS5iaW5hcnlfb3BzKSksRS5yaWdodF9hc3NvY2lhdGl2ZS5kZWxldGUoZSksRX1zdGF0aWMgcmVtb3ZlQWxsQmluYXJ5T3BzKCl7cmV0dXJuIEUuYmluYXJ5X29wcz17fSxFLm1heF9iaW5vcF9sZW49MCxFfXN0YXRpYyByZW1vdmVMaXRlcmFsKGUpe3JldHVybiBkZWxldGUgRS5saXRlcmFsc1tlXSxFfXN0YXRpYyByZW1vdmVBbGxMaXRlcmFscygpe3JldHVybiBFLmxpdGVyYWxzPXt9LEV9Z2V0IGNoYXIoKXtyZXR1cm4gdGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KX1nZXQgY29kZSgpe3JldHVybiB0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KX1jb25zdHJ1Y3RvcihlKXt0aGlzLmV4cHI9ZSx0aGlzLmluZGV4PTB9c3RhdGljIHBhcnNlKGUpe3JldHVybiBuZXcgRShlKS5wYXJzZSgpfXN0YXRpYyBnZXRNYXhLZXlMZW4oZSl7cmV0dXJuIE1hdGgubWF4KDAsLi4uT2JqZWN0LmtleXMoZSkubWFwKG49Pm4ubGVuZ3RoKSl9c3RhdGljIGlzRGVjaW1hbERpZ2l0KGUpe3JldHVybiBlPj00OCYmZTw9NTd9c3RhdGljIGJpbmFyeVByZWNlZGVuY2UoZSl7cmV0dXJuIEUuYmluYXJ5X29wc1tlXXx8MH1zdGF0aWMgaXNJZGVudGlmaWVyU3RhcnQoZSl7cmV0dXJuIGU+PTY1JiZlPD05MHx8ZT49OTcmJmU8PTEyMnx8ZT49MTI4JiYhRS5iaW5hcnlfb3BzW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldfHxFLmFkZGl0aW9uYWxfaWRlbnRpZmllcl9jaGFycy5oYXMoU3RyaW5nLmZyb21DaGFyQ29kZShlKSl9c3RhdGljIGlzSWRlbnRpZmllclBhcnQoZSl7cmV0dXJuIEUuaXNJZGVudGlmaWVyU3RhcnQoZSl8fEUuaXNEZWNpbWFsRGlnaXQoZSl9dGhyb3dFcnJvcihlKXtjb25zdCBuPW5ldyBFcnJvcihlKyIgYXQgY2hhcmFjdGVyICIrdGhpcy5pbmRleCk7dGhyb3cgbi5pbmRleD10aGlzLmluZGV4LG4uZGVzY3JpcHRpb249ZSxufXJ1bkhvb2soZSxuKXtpZihFLmhvb2tzW2VdKXtjb25zdCByPXtjb250ZXh0OnRoaXMsbm9kZTpufTtyZXR1cm4gRS5ob29rcy5ydW4oZSxyKSxyLm5vZGV9cmV0dXJuIG59c2VhcmNoSG9vayhlKXtpZihFLmhvb2tzW2VdKXtjb25zdCBuPXtjb250ZXh0OnRoaXN9O3JldHVybiBFLmhvb2tzW2VdLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2FsbChuLmNvbnRleHQsbiksbi5ub2RlfSksbi5ub2RlfX1nb2JibGVTcGFjZXMoKXtsZXQgZT10aGlzLmNvZGU7Zm9yKDtlPT09RS5TUEFDRV9DT0RFfHxlPT09RS5UQUJfQ09ERXx8ZT09PUUuTEZfQ09ERXx8ZT09PUUuQ1JfQ09ERTspZT10aGlzLmV4cHIuY2hhckNvZGVBdCgrK3RoaXMuaW5kZXgpO3RoaXMucnVuSG9vaygiZ29iYmxlLXNwYWNlcyIpfXBhcnNlKCl7dGhpcy5ydW5Ib29rKCJiZWZvcmUtYWxsIik7Y29uc3QgZT10aGlzLmdvYmJsZUV4cHJlc3Npb25zKCksbj1lLmxlbmd0aD09PTE/ZVswXTp7dHlwZTpFLkNPTVBPVU5ELGJvZHk6ZX07cmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItYWxsIixuKX1nb2JibGVFeHByZXNzaW9ucyhlKXtsZXQgbj1bXSxyLGk7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KWlmKHI9dGhpcy5jb2RlLHI9PT1FLlNFTUNPTF9DT0RFfHxyPT09RS5DT01NQV9DT0RFKXRoaXMuaW5kZXgrKztlbHNlIGlmKGk9dGhpcy5nb2JibGVFeHByZXNzaW9uKCkpbi5wdXNoKGkpO2Vsc2UgaWYodGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoKXtpZihyPT09ZSlicmVhazt0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgIicrdGhpcy5jaGFyKyciJyl9cmV0dXJuIG59Z29iYmxlRXhwcmVzc2lvbigpe2NvbnN0IGU9dGhpcy5zZWFyY2hIb29rKCJnb2JibGUtZXhwcmVzc2lvbiIpfHx0aGlzLmdvYmJsZUJpbmFyeUV4cHJlc3Npb24oKTtyZXR1cm4gdGhpcy5nb2JibGVTcGFjZXMoKSx0aGlzLnJ1bkhvb2soImFmdGVyLWV4cHJlc3Npb24iLGUpfWdvYmJsZUJpbmFyeU9wKCl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgZT10aGlzLmV4cHIuc3Vic3RyKHRoaXMuaW5kZXgsRS5tYXhfYmlub3BfbGVuKSxuPWUubGVuZ3RoO2Zvcig7bj4wOyl7aWYoRS5iaW5hcnlfb3BzLmhhc093blByb3BlcnR5KGUpJiYoIUUuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlKXx8dGhpcy5pbmRleCtlLmxlbmd0aDx0aGlzLmV4cHIubGVuZ3RoJiYhRS5pc0lkZW50aWZpZXJQYXJ0KHRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrZS5sZW5ndGgpKSkpcmV0dXJuIHRoaXMuaW5kZXgrPW4sZTtlPWUuc3Vic3RyKDAsLS1uKX1yZXR1cm4hMX1nb2JibGVCaW5hcnlFeHByZXNzaW9uKCl7bGV0IGUsbixyLGksbyxzLGgsYSxmO2lmKHM9dGhpcy5nb2JibGVUb2tlbigpLCFzfHwobj10aGlzLmdvYmJsZUJpbmFyeU9wKCksIW4pKXJldHVybiBzO2ZvcihvPXt2YWx1ZTpuLHByZWM6RS5iaW5hcnlQcmVjZWRlbmNlKG4pLHJpZ2h0X2E6RS5yaWdodF9hc3NvY2lhdGl2ZS5oYXMobil9LGg9dGhpcy5nb2JibGVUb2tlbigpLGh8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiBhZnRlciAiK24pLGk9W3MsbyxoXTtuPXRoaXMuZ29iYmxlQmluYXJ5T3AoKTspe2lmKHI9RS5iaW5hcnlQcmVjZWRlbmNlKG4pLHI9PT0wKXt0aGlzLmluZGV4LT1uLmxlbmd0aDticmVha31vPXt2YWx1ZTpuLHByZWM6cixyaWdodF9hOkUucmlnaHRfYXNzb2NpYXRpdmUuaGFzKG4pfSxmPW47Y29uc3QgZD1fPT5vLnJpZ2h0X2EmJl8ucmlnaHRfYT9yPl8ucHJlYzpyPD1fLnByZWM7Zm9yKDtpLmxlbmd0aD4yJiZkKGlbaS5sZW5ndGgtMl0pOyloPWkucG9wKCksbj1pLnBvcCgpLnZhbHVlLHM9aS5wb3AoKSxlPXt0eXBlOkUuQklOQVJZX0VYUCxvcGVyYXRvcjpuLGxlZnQ6cyxyaWdodDpofSxpLnB1c2goZSk7ZT10aGlzLmdvYmJsZVRva2VuKCksZXx8dGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBleHByZXNzaW9uIGFmdGVyICIrZiksaS5wdXNoKG8sZSl9Zm9yKGE9aS5sZW5ndGgtMSxlPWlbYV07YT4xOyllPXt0eXBlOkUuQklOQVJZX0VYUCxvcGVyYXRvcjppW2EtMV0udmFsdWUsbGVmdDppW2EtMl0scmlnaHQ6ZX0sYS09MjtyZXR1cm4gZX1nb2JibGVUb2tlbigpe2xldCBlLG4scixpO2lmKHRoaXMuZ29iYmxlU3BhY2VzKCksaT10aGlzLnNlYXJjaEhvb2soImdvYmJsZS10b2tlbiIpLGkpcmV0dXJuIHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLGkpO2lmKGU9dGhpcy5jb2RlLEUuaXNEZWNpbWFsRGlnaXQoZSl8fGU9PT1FLlBFUklPRF9DT0RFKXJldHVybiB0aGlzLmdvYmJsZU51bWVyaWNMaXRlcmFsKCk7aWYoZT09PUUuU1FVT1RFX0NPREV8fGU9PT1FLkRRVU9URV9DT0RFKWk9dGhpcy5nb2JibGVTdHJpbmdMaXRlcmFsKCk7ZWxzZSBpZihlPT09RS5PQlJBQ0tfQ09ERSlpPXRoaXMuZ29iYmxlQXJyYXkoKTtlbHNle2ZvcihuPXRoaXMuZXhwci5zdWJzdHIodGhpcy5pbmRleCxFLm1heF91bm9wX2xlbikscj1uLmxlbmd0aDtyPjA7KXtpZihFLnVuYXJ5X29wcy5oYXNPd25Qcm9wZXJ0eShuKSYmKCFFLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZSl8fHRoaXMuaW5kZXgrbi5sZW5ndGg8dGhpcy5leHByLmxlbmd0aCYmIUUuaXNJZGVudGlmaWVyUGFydCh0aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4K24ubGVuZ3RoKSkpKXt0aGlzLmluZGV4Kz1yO2NvbnN0IG89dGhpcy5nb2JibGVUb2tlbigpO3JldHVybiBvfHx0aGlzLnRocm93RXJyb3IoIm1pc3NpbmcgdW5hcnlPcCBhcmd1bWVudCIpLHRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLHt0eXBlOkUuVU5BUllfRVhQLG9wZXJhdG9yOm4sYXJndW1lbnQ6byxwcmVmaXg6ITB9KX1uPW4uc3Vic3RyKDAsLS1yKX1FLmlzSWRlbnRpZmllclN0YXJ0KGUpPyhpPXRoaXMuZ29iYmxlSWRlbnRpZmllcigpLEUubGl0ZXJhbHMuaGFzT3duUHJvcGVydHkoaS5uYW1lKT9pPXt0eXBlOkUuTElURVJBTCx2YWx1ZTpFLmxpdGVyYWxzW2kubmFtZV0scmF3OmkubmFtZX06aS5uYW1lPT09RS50aGlzX3N0ciYmKGk9e3R5cGU6RS5USElTX0VYUH0pKTplPT09RS5PUEFSRU5fQ09ERSYmKGk9dGhpcy5nb2JibGVHcm91cCgpKX1yZXR1cm4gaT8oaT10aGlzLmdvYmJsZVRva2VuUHJvcGVydHkoaSksdGhpcy5ydW5Ib29rKCJhZnRlci10b2tlbiIsaSkpOnRoaXMucnVuSG9vaygiYWZ0ZXItdG9rZW4iLCExKX1nb2JibGVUb2tlblByb3BlcnR5KGUpe3RoaXMuZ29iYmxlU3BhY2VzKCk7bGV0IG49dGhpcy5jb2RlO2Zvcig7bj09PUUuUEVSSU9EX0NPREV8fG49PT1FLk9CUkFDS19DT0RFfHxuPT09RS5PUEFSRU5fQ09ERXx8bj09PUUuUVVNQVJLX0NPREU7KXtsZXQgcjtpZihuPT09RS5RVU1BUktfQ09ERSl7aWYodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleCsxKSE9PUUuUEVSSU9EX0NPREUpYnJlYWs7cj0hMCx0aGlzLmluZGV4Kz0yLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9dGhpcy5pbmRleCsrLG49PT1FLk9CUkFDS19DT0RFPyhlPXt0eXBlOkUuTUVNQkVSX0VYUCxjb21wdXRlZDohMCxvYmplY3Q6ZSxwcm9wZXJ0eTp0aGlzLmdvYmJsZUV4cHJlc3Npb24oKX0sZS5wcm9wZXJ0eXx8dGhpcy50aHJvd0Vycm9yKCdVbmV4cGVjdGVkICInK3RoaXMuY2hhcisnIicpLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGUsbiE9PUUuQ0JSQUNLX0NPREUmJnRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgWyIpLHRoaXMuaW5kZXgrKyk6bj09PUUuT1BBUkVOX0NPREU/ZT17dHlwZTpFLkNBTExfRVhQLGFyZ3VtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNQQVJFTl9DT0RFKSxjYWxsZWU6ZX06KG49PT1FLlBFUklPRF9DT0RFfHxyKSYmKHImJnRoaXMuaW5kZXgtLSx0aGlzLmdvYmJsZVNwYWNlcygpLGU9e3R5cGU6RS5NRU1CRVJfRVhQLGNvbXB1dGVkOiExLG9iamVjdDplLHByb3BlcnR5OnRoaXMuZ29iYmxlSWRlbnRpZmllcigpfSksciYmKGUub3B0aW9uYWw9ITApLHRoaXMuZ29iYmxlU3BhY2VzKCksbj10aGlzLmNvZGV9cmV0dXJuIGV9Z29iYmxlTnVtZXJpY0xpdGVyYWwoKXtsZXQgZT0iIixuLHI7Zm9yKDtFLmlzRGVjaW1hbERpZ2l0KHRoaXMuY29kZSk7KWUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKTtpZih0aGlzLmNvZGU9PT1FLlBFUklPRF9DT0RFKWZvcihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7RS5pc0RlY2ltYWxEaWdpdCh0aGlzLmNvZGUpOyllKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobj10aGlzLmNoYXIsbj09PSJlInx8bj09PSJFIil7Zm9yKGUrPXRoaXMuZXhwci5jaGFyQXQodGhpcy5pbmRleCsrKSxuPXRoaXMuY2hhciwobj09PSIrInx8bj09PSItIikmJihlKz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKykpO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5jb2RlKTspZSs9dGhpcy5leHByLmNoYXJBdCh0aGlzLmluZGV4KyspO0UuaXNEZWNpbWFsRGlnaXQodGhpcy5leHByLmNoYXJDb2RlQXQodGhpcy5pbmRleC0xKSl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwb25lbnQgKCIrZSt0aGlzLmNoYXIrIikiKX1yZXR1cm4gcj10aGlzLmNvZGUsRS5pc0lkZW50aWZpZXJTdGFydChyKT90aGlzLnRocm93RXJyb3IoIlZhcmlhYmxlIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGEgbnVtYmVyICgiK2UrdGhpcy5jaGFyKyIpIik6KHI9PT1FLlBFUklPRF9DT0RFfHxlLmxlbmd0aD09PTEmJmUuY2hhckNvZGVBdCgwKT09PUUuUEVSSU9EX0NPREUpJiZ0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgcGVyaW9kIikse3R5cGU6RS5MSVRFUkFMLHZhbHVlOnBhcnNlRmxvYXQoZSkscmF3OmV9fWdvYmJsZVN0cmluZ0xpdGVyYWwoKXtsZXQgZT0iIjtjb25zdCBuPXRoaXMuaW5kZXgscj10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtsZXQgbz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyk7aWYobz09PXIpe2k9ITA7YnJlYWt9ZWxzZSBpZihvPT09IlxcIilzd2l0Y2gobz10aGlzLmV4cHIuY2hhckF0KHRoaXMuaW5kZXgrKyksbyl7Y2FzZSJuIjplKz1gCmA7YnJlYWs7Y2FzZSJyIjplKz0iXHIiO2JyZWFrO2Nhc2UidCI6ZSs9IgkiO2JyZWFrO2Nhc2UiYiI6ZSs9IlxiIjticmVhaztjYXNlImYiOmUrPSJcZiI7YnJlYWs7Y2FzZSJ2IjplKz0iXHYiO2JyZWFrO2RlZmF1bHQ6ZSs9b31lbHNlIGUrPW99cmV0dXJuIGl8fHRoaXMudGhyb3dFcnJvcignVW5jbG9zZWQgcXVvdGUgYWZ0ZXIgIicrZSsnIicpLHt0eXBlOkUuTElURVJBTCx2YWx1ZTplLHJhdzp0aGlzLmV4cHIuc3Vic3RyaW5nKG4sdGhpcy5pbmRleCl9fWdvYmJsZUlkZW50aWZpZXIoKXtsZXQgZT10aGlzLmNvZGUsbj10aGlzLmluZGV4O2ZvcihFLmlzSWRlbnRpZmllclN0YXJ0KGUpP3RoaXMuaW5kZXgrKzp0aGlzLnRocm93RXJyb3IoIlVuZXhwZWN0ZWQgIit0aGlzLmNoYXIpO3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aCYmKGU9dGhpcy5jb2RlLEUuaXNJZGVudGlmaWVyUGFydChlKSk7KXRoaXMuaW5kZXgrKztyZXR1cm57dHlwZTpFLklERU5USUZJRVIsbmFtZTp0aGlzLmV4cHIuc2xpY2Uobix0aGlzLmluZGV4KX19Z29iYmxlQXJndW1lbnRzKGUpe2NvbnN0IG49W107bGV0IHI9ITEsaT0wO2Zvcig7dGhpcy5pbmRleDx0aGlzLmV4cHIubGVuZ3RoOyl7dGhpcy5nb2JibGVTcGFjZXMoKTtsZXQgbz10aGlzLmNvZGU7aWYobz09PWUpe3I9ITAsdGhpcy5pbmRleCsrLGU9PT1FLkNQQVJFTl9DT0RFJiZpJiZpPj1uLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICIrU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWt9ZWxzZSBpZihvPT09RS5DT01NQV9DT0RFKXtpZih0aGlzLmluZGV4KyssaSsrLGkhPT1uLmxlbmd0aCl7aWYoZT09PUUuQ1BBUkVOX0NPREUpdGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIHRva2VuICwiKTtlbHNlIGlmKGU9PT1FLkNCUkFDS19DT0RFKWZvcihsZXQgcz1uLmxlbmd0aDtzPGk7cysrKW4ucHVzaChudWxsKX19ZWxzZSBpZihuLmxlbmd0aCE9PWkmJmkhPT0wKXRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgY29tbWEiKTtlbHNle2NvbnN0IHM9dGhpcy5nb2JibGVFeHByZXNzaW9uKCk7KCFzfHxzLnR5cGU9PT1FLkNPTVBPVU5EKSYmdGhpcy50aHJvd0Vycm9yKCJFeHBlY3RlZCBjb21tYSIpLG4ucHVzaChzKX19cmV0dXJuIHJ8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSxufWdvYmJsZUdyb3VwKCl7dGhpcy5pbmRleCsrO2xldCBlPXRoaXMuZ29iYmxlRXhwcmVzc2lvbnMoRS5DUEFSRU5fQ09ERSk7aWYodGhpcy5jb2RlPT09RS5DUEFSRU5fQ09ERSlyZXR1cm4gdGhpcy5pbmRleCsrLGUubGVuZ3RoPT09MT9lWzBdOmUubGVuZ3RoP3t0eXBlOkUuU0VRVUVOQ0VfRVhQLGV4cHJlc3Npb25zOmV9OiExO3RoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgKCIpfWdvYmJsZUFycmF5KCl7cmV0dXJuIHRoaXMuaW5kZXgrKyx7dHlwZTpFLkFSUkFZX0VYUCxlbGVtZW50czp0aGlzLmdvYmJsZUFyZ3VtZW50cyhFLkNCUkFDS19DT0RFKX19fWNvbnN0IHlmPW5ldyBfZjtPYmplY3QuYXNzaWduKEUse2hvb2tzOnlmLHBsdWdpbnM6bmV3IHBmKEUpLENPTVBPVU5EOiJDb21wb3VuZCIsU0VRVUVOQ0VfRVhQOiJTZXF1ZW5jZUV4cHJlc3Npb24iLElERU5USUZJRVI6IklkZW50aWZpZXIiLE1FTUJFUl9FWFA6Ik1lbWJlckV4cHJlc3Npb24iLExJVEVSQUw6IkxpdGVyYWwiLFRISVNfRVhQOiJUaGlzRXhwcmVzc2lvbiIsQ0FMTF9FWFA6IkNhbGxFeHByZXNzaW9uIixVTkFSWV9FWFA6IlVuYXJ5RXhwcmVzc2lvbiIsQklOQVJZX0VYUDoiQmluYXJ5RXhwcmVzc2lvbiIsQVJSQVlfRVhQOiJBcnJheUV4cHJlc3Npb24iLFRBQl9DT0RFOjksTEZfQ09ERToxMCxDUl9DT0RFOjEzLFNQQUNFX0NPREU6MzIsUEVSSU9EX0NPREU6NDYsQ09NTUFfQ09ERTo0NCxTUVVPVEVfQ09ERTozOSxEUVVPVEVfQ09ERTozNCxPUEFSRU5fQ09ERTo0MCxDUEFSRU5fQ09ERTo0MSxPQlJBQ0tfQ09ERTo5MSxDQlJBQ0tfQ09ERTo5MyxRVU1BUktfQ09ERTo2MyxTRU1DT0xfQ09ERTo1OSxDT0xPTl9DT0RFOjU4LHVuYXJ5X29wczp7Ii0iOjEsIiEiOjEsIn4iOjEsIisiOjF9LGJpbmFyeV9vcHM6eyJ8fCI6MSwiPz8iOjEsIiYmIjoyLCJ8IjozLCJeIjo0LCImIjo1LCI9PSI6NiwiIT0iOjYsIj09PSI6NiwiIT09Ijo2LCI8Ijo3LCI+Ijo3LCI8PSI6NywiPj0iOjcsIjw8Ijo4LCI+PiI6OCwiPj4+Ijo4LCIrIjo5LCItIjo5LCIqIjoxMCwiLyI6MTAsIiUiOjEwLCIqKiI6MTF9LHJpZ2h0X2Fzc29jaWF0aXZlOm5ldyBTZXQoWyIqKiJdKSxhZGRpdGlvbmFsX2lkZW50aWZpZXJfY2hhcnM6bmV3IFNldChbIiQiLCJfIl0pLGxpdGVyYWxzOnt0cnVlOiEwLGZhbHNlOiExLG51bGw6bnVsbH0sdGhpc19zdHI6InRoaXMifSksRS5tYXhfdW5vcF9sZW49RS5nZXRNYXhLZXlMZW4oRS51bmFyeV9vcHMpLEUubWF4X2Jpbm9wX2xlbj1FLmdldE1heEtleUxlbihFLmJpbmFyeV9vcHMpO2NvbnN0IEh0PXQ9Pm5ldyBFKHQpLnBhcnNlKCksQWY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2xhc3N7fSk7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRSkuZmlsdGVyKHQ9PiFBZi5pbmNsdWRlcyh0KSYmSHRbdF09PT12b2lkIDApLmZvckVhY2godD0+e0h0W3RdPUVbdF19KSxIdC5Kc2VwPUU7Y29uc3QgeGY9IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI7dmFyIE9mPXtuYW1lOiJ0ZXJuYXJ5Iixpbml0KHQpe3QuaG9va3MuYWRkKCJhZnRlci1leHByZXNzaW9uIixmdW5jdGlvbihuKXtpZihuLm5vZGUmJnRoaXMuY29kZT09PXQuUVVNQVJLX0NPREUpe3RoaXMuaW5kZXgrKztjb25zdCByPW4ubm9kZSxpPXRoaXMuZ29iYmxlRXhwcmVzc2lvbigpO2lmKGl8fHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgZXhwcmVzc2lvbiIpLHRoaXMuZ29iYmxlU3BhY2VzKCksdGhpcy5jb2RlPT09dC5DT0xPTl9DT0RFKXt0aGlzLmluZGV4Kys7Y29uc3Qgbz10aGlzLmdvYmJsZUV4cHJlc3Npb24oKTtpZihvfHx0aGlzLnRocm93RXJyb3IoIkV4cGVjdGVkIGV4cHJlc3Npb24iKSxuLm5vZGU9e3R5cGU6eGYsdGVzdDpyLGNvbnNlcXVlbnQ6aSxhbHRlcm5hdGU6b30sci5vcGVyYXRvciYmdC5iaW5hcnlfb3BzW3Iub3BlcmF0b3JdPD0uOSl7bGV0IHM9cjtmb3IoO3MucmlnaHQub3BlcmF0b3ImJnQuYmluYXJ5X29wc1tzLnJpZ2h0Lm9wZXJhdG9yXTw9Ljk7KXM9cy5yaWdodDtuLm5vZGUudGVzdD1zLnJpZ2h0LHMucmlnaHQ9bi5ub2RlLG4ubm9kZT1yfX1lbHNlIHRoaXMudGhyb3dFcnJvcigiRXhwZWN0ZWQgOiIpfX0pfX07SHQucGx1Z2lucy5yZWdpc3RlcihPZik7Y29uc3QgU2k9NDcsVGY9OTI7dmFyIFJmPXtuYW1lOiJyZWdleCIsaW5pdCh0KXt0Lmhvb2tzLmFkZCgiZ29iYmxlLXRva2VuIixmdW5jdGlvbihuKXtpZih0aGlzLmNvZGU9PT1TaSl7Y29uc3Qgcj0rK3RoaXMuaW5kZXg7bGV0IGk9ITE7Zm9yKDt0aGlzLmluZGV4PHRoaXMuZXhwci5sZW5ndGg7KXtpZih0aGlzLmNvZGU9PT1TaSYmIWkpe2NvbnN0IG89dGhpcy5leHByLnNsaWNlKHIsdGhpcy5pbmRleCk7bGV0IHM9IiI7Zm9yKDsrK3RoaXMuaW5kZXg8dGhpcy5leHByLmxlbmd0aDspe2NvbnN0IGE9dGhpcy5jb2RlO2lmKGE+PTk3JiZhPD0xMjJ8fGE+PTY1JiZhPD05MHx8YT49NDgmJmE8PTU3KXMrPXRoaXMuY2hhcjtlbHNlIGJyZWFrfWxldCBoO3RyeXtoPW5ldyBSZWdFeHAobyxzKX1jYXRjaChhKXt0aGlzLnRocm93RXJyb3IoYS5tZXNzYWdlKX1yZXR1cm4gbi5ub2RlPXt0eXBlOnQuTElURVJBTCx2YWx1ZTpoLHJhdzp0aGlzLmV4cHIuc2xpY2Uoci0xLHRoaXMuaW5kZXgpfSxuLm5vZGU9dGhpcy5nb2JibGVUb2tlblByb3BlcnR5KG4ubm9kZSksbi5ub2RlfXRoaXMuY29kZT09PXQuT0JSQUNLX0NPREU/aT0hMDppJiZ0aGlzLmNvZGU9PT10LkNCUkFDS19DT0RFJiYoaT0hMSksdGhpcy5pbmRleCs9dGhpcy5jb2RlPT09VGY/MjoxfXRoaXMudGhyb3dFcnJvcigiVW5jbG9zZWQgUmVnZXgiKX19KX19O2NvbnN0IEpuPTQzLHdlPXtuYW1lOiJhc3NpZ25tZW50Iixhc3NpZ25tZW50T3BlcmF0b3JzOm5ldyBTZXQoWyI9IiwiKj0iLCIqKj0iLCIvPSIsIiU9IiwiKz0iLCItPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsIl49IiwifD0iLCJ8fD0iLCImJj0iLCI/Pz0iXSksdXBkYXRlT3BlcmF0b3JzOltKbiw0NV0sYXNzaWdubWVudFByZWNlZGVuY2U6LjksaW5pdCh0KXtjb25zdCBlPVt0LklERU5USUZJRVIsdC5NRU1CRVJfRVhQXTt3ZS5hc3NpZ25tZW50T3BlcmF0b3JzLmZvckVhY2gocj0+dC5hZGRCaW5hcnlPcChyLHdlLmFzc2lnbm1lbnRQcmVjZWRlbmNlLCEwKSksdC5ob29rcy5hZGQoImdvYmJsZS10b2tlbiIsZnVuY3Rpb24oaSl7Y29uc3Qgbz10aGlzLmNvZGU7d2UudXBkYXRlT3BlcmF0b3JzLnNvbWUocz0+cz09PW8mJnM9PT10aGlzLmV4cHIuY2hhckNvZGVBdCh0aGlzLmluZGV4KzEpKSYmKHRoaXMuaW5kZXgrPTIsaS5ub2RlPXt0eXBlOiJVcGRhdGVFeHByZXNzaW9uIixvcGVyYXRvcjpvPT09Sm4/IisrIjoiLS0iLGFyZ3VtZW50OnRoaXMuZ29iYmxlVG9rZW5Qcm9wZXJ0eSh0aGlzLmdvYmJsZUlkZW50aWZpZXIoKSkscHJlZml4OiEwfSwoIWkubm9kZS5hcmd1bWVudHx8IWUuaW5jbHVkZXMoaS5ub2RlLmFyZ3VtZW50LnR5cGUpKSYmdGhpcy50aHJvd0Vycm9yKGBVbmV4cGVjdGVkICR7aS5ub2RlLm9wZXJhdG9yfWApKX0pLHQuaG9va3MuYWRkKCJhZnRlci10b2tlbiIsZnVuY3Rpb24oaSl7aWYoaS5ub2RlKXtjb25zdCBvPXRoaXMuY29kZTt3ZS51cGRhdGVPcGVyYXRvcnMuc29tZShzPT5zPT09byYmcz09PXRoaXMuZXhwci5jaGFyQ29kZUF0KHRoaXMuaW5kZXgrMSkpJiYoZS5pbmNsdWRlcyhpLm5vZGUudHlwZSl8fHRoaXMudGhyb3dFcnJvcihgVW5leHBlY3RlZCAke2kubm9kZS5vcGVyYXRvcn1gKSx0aGlzLmluZGV4Kz0yLGkubm9kZT17dHlwZToiVXBkYXRlRXhwcmVzc2lvbiIsb3BlcmF0b3I6bz09PUpuPyIrKyI6Ii0tIixhcmd1bWVudDppLm5vZGUscHJlZml4OiExfSl9fSksdC5ob29rcy5hZGQoImFmdGVyLWV4cHJlc3Npb24iLGZ1bmN0aW9uKGkpe2kubm9kZSYmbihpLm5vZGUpfSk7ZnVuY3Rpb24gbihyKXt3ZS5hc3NpZ25tZW50T3BlcmF0b3JzLmhhcyhyLm9wZXJhdG9yKT8oci50eXBlPSJBc3NpZ25tZW50RXhwcmVzc2lvbiIsbihyLmxlZnQpLG4oci5yaWdodCkpOnIub3BlcmF0b3J8fE9iamVjdC52YWx1ZXMocikuZm9yRWFjaChpPT57aSYmdHlwZW9mIGk9PSJvYmplY3QiJiZuKGkpfSl9fX07SHQucGx1Z2lucy5yZWdpc3RlcihSZix3ZSksSHQuYWRkVW5hcnlPcCgidHlwZW9mIiksSHQuYWRkTGl0ZXJhbCgibnVsbCIsbnVsbCksSHQuYWRkTGl0ZXJhbCgidW5kZWZpbmVkIix2b2lkIDApO2NvbnN0IGJmPW5ldyBTZXQoWyJjb25zdHJ1Y3RvciIsIl9fcHJvdG9fXyIsIl9fZGVmaW5lR2V0dGVyX18iLCJfX2RlZmluZVNldHRlcl9fIl0pLHE9e2V2YWxBc3QodCxlKXtzd2l0Y2godC50eXBlKXtjYXNlIkJpbmFyeUV4cHJlc3Npb24iOmNhc2UiTG9naWNhbEV4cHJlc3Npb24iOnJldHVybiBxLmV2YWxCaW5hcnlFeHByZXNzaW9uKHQsZSk7Y2FzZSJDb21wb3VuZCI6cmV0dXJuIHEuZXZhbENvbXBvdW5kKHQsZSk7Y2FzZSJDb25kaXRpb25hbEV4cHJlc3Npb24iOnJldHVybiBxLmV2YWxDb25kaXRpb25hbEV4cHJlc3Npb24odCxlKTtjYXNlIklkZW50aWZpZXIiOnJldHVybiBxLmV2YWxJZGVudGlmaWVyKHQsZSk7Y2FzZSJMaXRlcmFsIjpyZXR1cm4gcS5ldmFsTGl0ZXJhbCh0LGUpO2Nhc2UiTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbE1lbWJlckV4cHJlc3Npb24odCxlKTtjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbFVuYXJ5RXhwcmVzc2lvbih0LGUpO2Nhc2UiQXJyYXlFeHByZXNzaW9uIjpyZXR1cm4gcS5ldmFsQXJyYXlFeHByZXNzaW9uKHQsZSk7Y2FzZSJDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbENhbGxFeHByZXNzaW9uKHQsZSk7Y2FzZSJBc3NpZ25tZW50RXhwcmVzc2lvbiI6cmV0dXJuIHEuZXZhbEFzc2lnbm1lbnRFeHByZXNzaW9uKHQsZSk7ZGVmYXVsdDp0aHJvdyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCBleHByZXNzaW9uIix0KX19LGV2YWxCaW5hcnlFeHByZXNzaW9uKHQsZSl7cmV0dXJueyJ8fCI6KHIsaSk9PnJ8fGkoKSwiJiYiOihyLGkpPT5yJiZpKCksInwiOihyLGkpPT5yfGkoKSwiXiI6KHIsaSk9PnJeaSgpLCImIjoocixpKT0+ciZpKCksIj09IjoocixpKT0+cj09aSgpLCIhPSI6KHIsaSk9PnIhPWkoKSwiPT09IjoocixpKT0+cj09PWkoKSwiIT09IjoocixpKT0+ciE9PWkoKSwiPCI6KHIsaSk9PnI8aSgpLCI+IjoocixpKT0+cj5pKCksIjw9IjoocixpKT0+cjw9aSgpLCI+PSI6KHIsaSk9PnI+PWkoKSwiPDwiOihyLGkpPT5yPDxpKCksIj4+IjoocixpKT0+cj4+aSgpLCI+Pj4iOihyLGkpPT5yPj4+aSgpLCIrIjoocixpKT0+citpKCksIi0iOihyLGkpPT5yLWkoKSwiKiI6KHIsaSk9PnIqaSgpLCIvIjoocixpKT0+ci9pKCksIiUiOihyLGkpPT5yJWkoKX1bdC5vcGVyYXRvcl0ocS5ldmFsQXN0KHQubGVmdCxlKSwoKT0+cS5ldmFsQXN0KHQucmlnaHQsZSkpfSxldmFsQ29tcG91bmQodCxlKXtsZXQgbjtmb3IobGV0IHI9MDtyPHQuYm9keS5sZW5ndGg7cisrKXt0LmJvZHlbcl0udHlwZT09PSJJZGVudGlmaWVyIiYmWyJ2YXIiLCJsZXQiLCJjb25zdCJdLmluY2x1ZGVzKHQuYm9keVtyXS5uYW1lKSYmdC5ib2R5W3IrMV0mJnQuYm9keVtyKzFdLnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iJiYocis9MSk7Y29uc3QgaT10LmJvZHlbcl07bj1xLmV2YWxBc3QoaSxlKX1yZXR1cm4gbn0sZXZhbENvbmRpdGlvbmFsRXhwcmVzc2lvbih0LGUpe3JldHVybiBxLmV2YWxBc3QodC50ZXN0LGUpP3EuZXZhbEFzdCh0LmNvbnNlcXVlbnQsZSk6cS5ldmFsQXN0KHQuYWx0ZXJuYXRlLGUpfSxldmFsSWRlbnRpZmllcih0LGUpe2lmKE9iamVjdC5oYXNPd24oZSx0Lm5hbWUpKXJldHVybiBlW3QubmFtZV07dGhyb3cgUmVmZXJlbmNlRXJyb3IoYCR7dC5uYW1lfSBpcyBub3QgZGVmaW5lZGApfSxldmFsTGl0ZXJhbCh0KXtyZXR1cm4gdC52YWx1ZX0sZXZhbE1lbWJlckV4cHJlc3Npb24odCxlKXtjb25zdCBuPVN0cmluZyh0LmNvbXB1dGVkP3EuZXZhbEFzdCh0LnByb3BlcnR5KTp0LnByb3BlcnR5Lm5hbWUpLHI9cS5ldmFsQXN0KHQub2JqZWN0LGUpO2lmKHI9PW51bGwpdGhyb3cgVHlwZUVycm9yKGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mICR7cn0gKHJlYWRpbmcgJyR7bn0nKWApO2lmKCFPYmplY3QuaGFzT3duKHIsbikmJmJmLmhhcyhuKSl0aHJvdyBUeXBlRXJyb3IoYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgJHtyfSAocmVhZGluZyAnJHtufScpYCk7Y29uc3QgaT1yW25dO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIj9pLmJpbmQocik6aX0sZXZhbFVuYXJ5RXhwcmVzc2lvbih0LGUpe3JldHVybnsiLSI6cj0+LXEuZXZhbEFzdChyLGUpLCIhIjpyPT4hcS5ldmFsQXN0KHIsZSksIn4iOnI9Pn5xLmV2YWxBc3QocixlKSwiKyI6cj0+K3EuZXZhbEFzdChyLGUpLHR5cGVvZjpyPT50eXBlb2YgcS5ldmFsQXN0KHIsZSl9W3Qub3BlcmF0b3JdKHQuYXJndW1lbnQpfSxldmFsQXJyYXlFeHByZXNzaW9uKHQsZSl7cmV0dXJuIHQuZWxlbWVudHMubWFwKG49PnEuZXZhbEFzdChuLGUpKX0sZXZhbENhbGxFeHByZXNzaW9uKHQsZSl7Y29uc3Qgbj10LmFyZ3VtZW50cy5tYXAoaT0+cS5ldmFsQXN0KGksZSkpO3JldHVybiBxLmV2YWxBc3QodC5jYWxsZWUsZSkoLi4ubil9LGV2YWxBc3NpZ25tZW50RXhwcmVzc2lvbih0LGUpe2lmKHQubGVmdC50eXBlIT09IklkZW50aWZpZXIiKXRocm93IFN5bnRheEVycm9yKCJJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGFzc2lnbm1lbnQiKTtjb25zdCBuPXQubGVmdC5uYW1lLHI9cS5ldmFsQXN0KHQucmlnaHQsZSk7cmV0dXJuIGVbbl09cixlW25dfX07Y2xhc3MgZ2Z7Y29uc3RydWN0b3IoZSl7dGhpcy5jb2RlPWUsdGhpcy5hc3Q9SHQodGhpcy5jb2RlKX1ydW5Jbk5ld0NvbnRleHQoZSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksZSk7cmV0dXJuIHEuZXZhbEFzdCh0aGlzLmFzdCxuKX19ZnVuY3Rpb24gSnQodCxlKXtyZXR1cm4gdD10LnNsaWNlKCksdC5wdXNoKGUpLHR9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gZT1lLnNsaWNlKCksZS51bnNoaWZ0KHQpLGV9Y2xhc3MgbWYgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcignSlNPTlBhdGggc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCAibmV3IiAoaXQgcHJldmVudHMgcmV0dXJuIG9mICh1bndyYXBwZWQpIHNjYWxhciB2YWx1ZXMpJyksdGhpcy5hdm9pZE5ldz0hMCx0aGlzLnZhbHVlPWUsdGhpcy5uYW1lPSJOZXdFcnJvciJ9fWZ1bmN0aW9uICQodCxlLG4scixpKXtpZighKHRoaXMgaW5zdGFuY2VvZiAkKSl0cnl7cmV0dXJuIG5ldyAkKHQsZSxuLHIsaSl9Y2F0Y2gocyl7aWYoIXMuYXZvaWROZXcpdGhyb3cgcztyZXR1cm4gcy52YWx1ZX10eXBlb2YgdD09InN0cmluZyImJihpPXIscj1uLG49ZSxlPXQsdD1udWxsKTtjb25zdCBvPXQmJnR5cGVvZiB0PT0ib2JqZWN0IjtpZih0PXR8fHt9LHRoaXMuanNvbj10Lmpzb258fG4sdGhpcy5wYXRoPXQucGF0aHx8ZSx0aGlzLnJlc3VsdFR5cGU9dC5yZXN1bHRUeXBlfHwidmFsdWUiLHRoaXMuZmxhdHRlbj10LmZsYXR0ZW58fCExLHRoaXMud3JhcD1PYmplY3QuaGFzT3duKHQsIndyYXAiKT90LndyYXA6ITAsdGhpcy5zYW5kYm94PXQuc2FuZGJveHx8e30sdGhpcy5ldmFsPXQuZXZhbD09PXZvaWQgMD8ic2FmZSI6dC5ldmFsLHRoaXMuaWdub3JlRXZhbEVycm9ycz10eXBlb2YgdC5pZ25vcmVFdmFsRXJyb3JzPiJ1Ij8hMTp0Lmlnbm9yZUV2YWxFcnJvcnMsdGhpcy5wYXJlbnQ9dC5wYXJlbnR8fG51bGwsdGhpcy5wYXJlbnRQcm9wZXJ0eT10LnBhcmVudFByb3BlcnR5fHxudWxsLHRoaXMuY2FsbGJhY2s9dC5jYWxsYmFja3x8cnx8bnVsbCx0aGlzLm90aGVyVHlwZUNhbGxiYWNrPXQub3RoZXJUeXBlQ2FsbGJhY2t8fGl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3Qgc3VwcGx5IGFuIG90aGVyVHlwZUNhbGxiYWNrIGNhbGxiYWNrIG9wdGlvbiB3aXRoIHRoZSBAb3RoZXIoKSBvcGVyYXRvci4iKX0sdC5hdXRvc3RhcnQhPT0hMSl7Y29uc3Qgcz17cGF0aDpvP3QucGF0aDplfTtvPyJqc29uImluIHQmJihzLmpzb249dC5qc29uKTpzLmpzb249bjtjb25zdCBoPXRoaXMuZXZhbHVhdGUocyk7aWYoIWh8fHR5cGVvZiBoIT0ib2JqZWN0Iil0aHJvdyBuZXcgbWYoaCk7cmV0dXJuIGh9fSQucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKHQsZSxuLHIpe2xldCBpPXRoaXMucGFyZW50LG89dGhpcy5wYXJlbnRQcm9wZXJ0eSx7ZmxhdHRlbjpzLHdyYXA6aH09dGhpcztpZih0aGlzLmN1cnJSZXN1bHRUeXBlPXRoaXMucmVzdWx0VHlwZSx0aGlzLmN1cnJFdmFsPXRoaXMuZXZhbCx0aGlzLmN1cnJTYW5kYm94PXRoaXMuc2FuZGJveCxuPW58fHRoaXMuY2FsbGJhY2ssdGhpcy5jdXJyT3RoZXJUeXBlQ2FsbGJhY2s9cnx8dGhpcy5vdGhlclR5cGVDYWxsYmFjayxlPWV8fHRoaXMuanNvbix0PXR8fHRoaXMucGF0aCx0JiZ0eXBlb2YgdD09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KHQpKXtpZighdC5wYXRoJiZ0LnBhdGghPT0iIil0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSAicGF0aCIgcHJvcGVydHkgd2hlbiBwcm92aWRpbmcgYW4gb2JqZWN0IGFyZ3VtZW50IHRvIEpTT05QYXRoLmV2YWx1YXRlKCkuJyk7aWYoIU9iamVjdC5oYXNPd24odCwianNvbiIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhICJqc29uIiBwcm9wZXJ0eSB3aGVuIHByb3ZpZGluZyBhbiBvYmplY3QgYXJndW1lbnQgdG8gSlNPTlBhdGguZXZhbHVhdGUoKS4nKTsoe2pzb246ZX09dCkscz1PYmplY3QuaGFzT3duKHQsImZsYXR0ZW4iKT90LmZsYXR0ZW46cyx0aGlzLmN1cnJSZXN1bHRUeXBlPU9iamVjdC5oYXNPd24odCwicmVzdWx0VHlwZSIpP3QucmVzdWx0VHlwZTp0aGlzLmN1cnJSZXN1bHRUeXBlLHRoaXMuY3VyclNhbmRib3g9T2JqZWN0Lmhhc093bih0LCJzYW5kYm94Iik/dC5zYW5kYm94OnRoaXMuY3VyclNhbmRib3gsaD1PYmplY3QuaGFzT3duKHQsIndyYXAiKT90LndyYXA6aCx0aGlzLmN1cnJFdmFsPU9iamVjdC5oYXNPd24odCwiZXZhbCIpP3QuZXZhbDp0aGlzLmN1cnJFdmFsLG49T2JqZWN0Lmhhc093bih0LCJjYWxsYmFjayIpP3QuY2FsbGJhY2s6bix0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjaz1PYmplY3QuaGFzT3duKHQsIm90aGVyVHlwZUNhbGxiYWNrIik/dC5vdGhlclR5cGVDYWxsYmFjazp0aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjayxpPU9iamVjdC5oYXNPd24odCwicGFyZW50Iik/dC5wYXJlbnQ6aSxvPU9iamVjdC5oYXNPd24odCwicGFyZW50UHJvcGVydHkiKT90LnBhcmVudFByb3BlcnR5Om8sdD10LnBhdGh9aWYoaT1pfHxudWxsLG89b3x8bnVsbCxBcnJheS5pc0FycmF5KHQpJiYodD0kLnRvUGF0aFN0cmluZyh0KSksIXQmJnQhPT0iInx8IWUpcmV0dXJuO2NvbnN0IGE9JC50b1BhdGhBcnJheSh0KTthWzBdPT09IiQiJiZhLmxlbmd0aD4xJiZhLnNoaWZ0KCksdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9bnVsbDtjb25zdCBmPXRoaXMuX3RyYWNlKGEsZSxbIiQiXSxpLG8sbikuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkJiYhZC5pc1BhcmVudFNlbGVjdG9yfSk7cmV0dXJuIGYubGVuZ3RoPyFoJiZmLmxlbmd0aD09PTEmJiFmWzBdLmhhc0FyckV4cHI/dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KGZbMF0pOmYucmVkdWNlKChkLF8pPT57Y29uc3QgUz10aGlzLl9nZXRQcmVmZXJyZWRPdXRwdXQoXyk7cmV0dXJuIHMmJkFycmF5LmlzQXJyYXkoUyk/ZD1kLmNvbmNhdChTKTpkLnB1c2goUyksZH0sW10pOmg/W106dm9pZCAwfSwkLnByb3RvdHlwZS5fZ2V0UHJlZmVycmVkT3V0cHV0PWZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5jdXJyUmVzdWx0VHlwZTtzd2l0Y2goZSl7Y2FzZSJhbGwiOntjb25zdCBuPUFycmF5LmlzQXJyYXkodC5wYXRoKT90LnBhdGg6JC50b1BhdGhBcnJheSh0LnBhdGgpO3JldHVybiB0LnBvaW50ZXI9JC50b1BvaW50ZXIobiksdC5wYXRoPXR5cGVvZiB0LnBhdGg9PSJzdHJpbmciP3QucGF0aDokLnRvUGF0aFN0cmluZyh0LnBhdGgpLHR9Y2FzZSJ2YWx1ZSI6Y2FzZSJwYXJlbnQiOmNhc2UicGFyZW50UHJvcGVydHkiOnJldHVybiB0W2VdO2Nhc2UicGF0aCI6cmV0dXJuICQudG9QYXRoU3RyaW5nKHRbZV0pO2Nhc2UicG9pbnRlciI6cmV0dXJuICQudG9Qb2ludGVyKHQucGF0aCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHJlc3VsdCB0eXBlIil9fSwkLnByb3RvdHlwZS5faGFuZGxlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe2lmKGUpe2NvbnN0IHI9dGhpcy5fZ2V0UHJlZmVycmVkT3V0cHV0KHQpO3QucGF0aD10eXBlb2YgdC5wYXRoPT0ic3RyaW5nIj90LnBhdGg6JC50b1BhdGhTdHJpbmcodC5wYXRoKSxlKHIsbix0KX19LCQucHJvdG90eXBlLl90cmFjZT1mdW5jdGlvbih0LGUsbixyLGksbyxzLGgpe2xldCBhO2lmKCF0Lmxlbmd0aClyZXR1cm4gYT17cGF0aDpuLHZhbHVlOmUscGFyZW50OnIscGFyZW50UHJvcGVydHk6aSxoYXNBcnJFeHByOnN9LHRoaXMuX2hhbmRsZUNhbGxiYWNrKGEsbywidmFsdWUiKSxhO2NvbnN0IGY9dFswXSxkPXQuc2xpY2UoMSksXz1bXTtmdW5jdGlvbiBTKE8pe0FycmF5LmlzQXJyYXkoTyk/Ty5mb3JFYWNoKHc9PntfLnB1c2godyl9KTpfLnB1c2goTyl9aWYoKHR5cGVvZiBmIT0ic3RyaW5nInx8aCkmJmUmJk9iamVjdC5oYXNPd24oZSxmKSlTKHRoaXMuX3RyYWNlKGQsZVtmXSxKdChuLGYpLGUsZixvLHMpKTtlbHNlIGlmKGY9PT0iKiIpdGhpcy5fd2FsayhlLE89PntTKHRoaXMuX3RyYWNlKGQsZVtPXSxKdChuLE8pLGUsTyxvLCEwLCEwKSl9KTtlbHNlIGlmKGY9PT0iLi4iKVModGhpcy5fdHJhY2UoZCxlLG4scixpLG8scykpLHRoaXMuX3dhbGsoZSxPPT57dHlwZW9mIGVbT109PSJvYmplY3QiJiZTKHRoaXMuX3RyYWNlKHQuc2xpY2UoKSxlW09dLEp0KG4sTyksZSxPLG8sITApKX0pO2Vsc2V7aWYoZj09PSJeIilyZXR1cm4gdGhpcy5faGFzUGFyZW50U2VsZWN0b3I9ITAse3BhdGg6bi5zbGljZSgwLC0xKSxleHByOmQsaXNQYXJlbnRTZWxlY3RvcjohMH07aWYoZj09PSJ+IilyZXR1cm4gYT17cGF0aDpKdChuLGYpLHZhbHVlOmkscGFyZW50OnIscGFyZW50UHJvcGVydHk6bnVsbH0sdGhpcy5faGFuZGxlQ2FsbGJhY2soYSxvLCJwcm9wZXJ0eSIpLGE7aWYoZj09PSIkIilTKHRoaXMuX3RyYWNlKGQsZSxuLG51bGwsbnVsbCxvLHMpKTtlbHNlIGlmKC9eKC0/XGQqKTooLT9cZCopOj8oXGQqKSQvdS50ZXN0KGYpKVModGhpcy5fc2xpY2UoZixkLGUsbixyLGksbykpO2Vsc2UgaWYoZi5pbmRleE9mKCI/KCIpPT09MCl7aWYodGhpcy5jdXJyRXZhbD09PSExKXRocm93IG5ldyBFcnJvcigiRXZhbCBbPyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7Y29uc3QgTz1mLnJlcGxhY2UoL15cP1woKC4qPylcKSQvdSwiJDEiKSx3PS9ALj8oW14/XSopW1snXShcPz9cKC4qP1wpKSg/IS5cKVxdKVtcXSddL2d1LmV4ZWMoTyk7dz90aGlzLl93YWxrKGUsYj0+e2NvbnN0IE09W3dbMl1dLG09d1sxXT9lW2JdW3dbMV1dOmVbYl07dGhpcy5fdHJhY2UoTSxtLG4scixpLG8sITApLmxlbmd0aD4wJiZTKHRoaXMuX3RyYWNlKGQsZVtiXSxKdChuLGIpLGUsYixvLCEwKSl9KTp0aGlzLl93YWxrKGUsYj0+e3RoaXMuX2V2YWwoTyxlW2JdLGIsbixyLGkpJiZTKHRoaXMuX3RyYWNlKGQsZVtiXSxKdChuLGIpLGUsYixvLCEwKSl9KX1lbHNlIGlmKGZbMF09PT0iKCIpe2lmKHRoaXMuY3VyckV2YWw9PT0hMSl0aHJvdyBuZXcgRXJyb3IoIkV2YWwgWyhleHByKV0gcHJldmVudGVkIGluIEpTT05QYXRoIGV4cHJlc3Npb24uIik7Uyh0aGlzLl90cmFjZSh0cih0aGlzLl9ldmFsKGYsZSxuLmF0KC0xKSxuLnNsaWNlKDAsLTEpLHIsaSksZCksZSxuLHIsaSxvLHMpKX1lbHNlIGlmKGZbMF09PT0iQCIpe2xldCBPPSExO2NvbnN0IHc9Zi5zbGljZSgxLC0yKTtzd2l0Y2godyl7Y2FzZSJzY2FsYXIiOighZXx8IVsib2JqZWN0IiwiZnVuY3Rpb24iXS5pbmNsdWRlcyh0eXBlb2YgZSkpJiYoTz0hMCk7YnJlYWs7Y2FzZSJib29sZWFuIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOmNhc2UiZnVuY3Rpb24iOnR5cGVvZiBlPT09dyYmKE89ITApO2JyZWFrO2Nhc2UiaW50ZWdlciI6TnVtYmVyLmlzRmluaXRlKGUpJiYhKGUlMSkmJihPPSEwKTticmVhaztjYXNlIm51bWJlciI6TnVtYmVyLmlzRmluaXRlKGUpJiYoTz0hMCk7YnJlYWs7Y2FzZSJub25GaW5pdGUiOnR5cGVvZiBlPT0ibnVtYmVyIiYmIU51bWJlci5pc0Zpbml0ZShlKSYmKE89ITApO2JyZWFrO2Nhc2Uib2JqZWN0IjplJiZ0eXBlb2YgZT09PXcmJihPPSEwKTticmVhaztjYXNlImFycmF5IjpBcnJheS5pc0FycmF5KGUpJiYoTz0hMCk7YnJlYWs7Y2FzZSJvdGhlciI6Tz10aGlzLmN1cnJPdGhlclR5cGVDYWxsYmFjayhlLG4scixpKTticmVhaztjYXNlIm51bGwiOmU9PT1udWxsJiYoTz0hMCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIHZhbHVlIHR5cGUgIit3KX1pZihPKXJldHVybiBhPXtwYXRoOm4sdmFsdWU6ZSxwYXJlbnQ6cixwYXJlbnRQcm9wZXJ0eTppfSx0aGlzLl9oYW5kbGVDYWxsYmFjayhhLG8sInZhbHVlIiksYX1lbHNlIGlmKGZbMF09PT0iYCImJmUmJk9iamVjdC5oYXNPd24oZSxmLnNsaWNlKDEpKSl7Y29uc3QgTz1mLnNsaWNlKDEpO1ModGhpcy5fdHJhY2UoZCxlW09dLEp0KG4sTyksZSxPLG8scywhMCkpfWVsc2UgaWYoZi5pbmNsdWRlcygiLCIpKXtjb25zdCBPPWYuc3BsaXQoIiwiKTtmb3IoY29uc3QgdyBvZiBPKVModGhpcy5fdHJhY2UodHIodyxkKSxlLG4scixpLG8sITApKX1lbHNlIWgmJmUmJk9iamVjdC5oYXNPd24oZSxmKSYmUyh0aGlzLl90cmFjZShkLGVbZl0sSnQobixmKSxlLGYsbyxzLCEwKSl9aWYodGhpcy5faGFzUGFyZW50U2VsZWN0b3IpZm9yKGxldCBPPTA7TzxfLmxlbmd0aDtPKyspe2NvbnN0IHc9X1tPXTtpZih3JiZ3LmlzUGFyZW50U2VsZWN0b3Ipe2NvbnN0IGI9dGhpcy5fdHJhY2Uody5leHByLGUsdy5wYXRoLHIsaSxvLHMpO2lmKEFycmF5LmlzQXJyYXkoYikpe19bT109YlswXTtjb25zdCBNPWIubGVuZ3RoO2ZvcihsZXQgbT0xO208TTttKyspTysrLF8uc3BsaWNlKE8sMCxiW21dKX1lbHNlIF9bT109Yn19cmV0dXJuIF99LCQucHJvdG90eXBlLl93YWxrPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj10Lmxlbmd0aDtmb3IobGV0IHI9MDtyPG47cisrKWUocil9ZWxzZSB0JiZ0eXBlb2YgdD09Im9iamVjdCImJk9iamVjdC5rZXlzKHQpLmZvckVhY2gobj0+e2Uobil9KX0sJC5wcm90b3R5cGUuX3NsaWNlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe2lmKCFBcnJheS5pc0FycmF5KG4pKXJldHVybjtjb25zdCBoPW4ubGVuZ3RoLGE9dC5zcGxpdCgiOiIpLGY9YVsyXSYmTnVtYmVyLnBhcnNlSW50KGFbMl0pfHwxO2xldCBkPWFbMF0mJk51bWJlci5wYXJzZUludChhWzBdKXx8MCxfPWFbMV0mJk51bWJlci5wYXJzZUludChhWzFdKXx8aDtkPWQ8MD9NYXRoLm1heCgwLGQraCk6TWF0aC5taW4oaCxkKSxfPV88MD9NYXRoLm1heCgwLF8raCk6TWF0aC5taW4oaCxfKTtjb25zdCBTPVtdO2ZvcihsZXQgTz1kO088XztPKz1mKXRoaXMuX3RyYWNlKHRyKE8sZSksbixyLGksbyxzLCEwKS5mb3JFYWNoKGI9PntTLnB1c2goYil9KTtyZXR1cm4gU30sJC5wcm90b3R5cGUuX2V2YWw9ZnVuY3Rpb24odCxlLG4scixpLG8pe3RoaXMuY3VyclNhbmRib3guXyRfcGFyZW50UHJvcGVydHk9byx0aGlzLmN1cnJTYW5kYm94Ll8kX3BhcmVudD1pLHRoaXMuY3VyclNhbmRib3guXyRfcHJvcGVydHk9bix0aGlzLmN1cnJTYW5kYm94Ll8kX3Jvb3Q9dGhpcy5qc29uLHRoaXMuY3VyclNhbmRib3guXyRfdj1lO2NvbnN0IHM9dC5pbmNsdWRlcygiQHBhdGgiKTtzJiYodGhpcy5jdXJyU2FuZGJveC5fJF9wYXRoPSQudG9QYXRoU3RyaW5nKHIuY29uY2F0KFtuXSkpKTtjb25zdCBoPXRoaXMuY3VyckV2YWwrIlNjcmlwdDoiK3Q7aWYoISQuY2FjaGVbaF0pe2xldCBhPXQucmVwbGFjZUFsbCgiQHBhcmVudFByb3BlcnR5IiwiXyRfcGFyZW50UHJvcGVydHkiKS5yZXBsYWNlQWxsKCJAcGFyZW50IiwiXyRfcGFyZW50IikucmVwbGFjZUFsbCgiQHByb3BlcnR5IiwiXyRfcHJvcGVydHkiKS5yZXBsYWNlQWxsKCJAcm9vdCIsIl8kX3Jvb3QiKS5yZXBsYWNlQWxsKC9AKFsuXHMpW10pL2d1LCJfJF92JDEiKTtpZihzJiYoYT1hLnJlcGxhY2VBbGwoIkBwYXRoIiwiXyRfcGF0aCIpKSx0aGlzLmN1cnJFdmFsPT09InNhZmUifHx0aGlzLmN1cnJFdmFsPT09ITB8fHRoaXMuY3VyckV2YWw9PT12b2lkIDApJC5jYWNoZVtoXT1uZXcgdGhpcy5zYWZlVm0uU2NyaXB0KGEpO2Vsc2UgaWYodGhpcy5jdXJyRXZhbD09PSJuYXRpdmUiKSQuY2FjaGVbaF09bmV3IHRoaXMudm0uU2NyaXB0KGEpO2Vsc2UgaWYodHlwZW9mIHRoaXMuY3VyckV2YWw9PSJmdW5jdGlvbiImJnRoaXMuY3VyckV2YWwucHJvdG90eXBlJiZPYmplY3QuaGFzT3duKHRoaXMuY3VyckV2YWwucHJvdG90eXBlLCJydW5Jbk5ld0NvbnRleHQiKSl7Y29uc3QgZj10aGlzLmN1cnJFdmFsOyQuY2FjaGVbaF09bmV3IGYoYSl9ZWxzZSBpZih0eXBlb2YgdGhpcy5jdXJyRXZhbD09ImZ1bmN0aW9uIikkLmNhY2hlW2hdPXtydW5Jbk5ld0NvbnRleHQ6Zj0+dGhpcy5jdXJyRXZhbChhLGYpfTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gImV2YWwiIHByb3BlcnR5ICIke3RoaXMuY3VyckV2YWx9ImApfXRyeXtyZXR1cm4gJC5jYWNoZVtoXS5ydW5Jbk5ld0NvbnRleHQodGhpcy5jdXJyU2FuZGJveCl9Y2F0Y2goYSl7aWYodGhpcy5pZ25vcmVFdmFsRXJyb3JzKXJldHVybiExO3Rocm93IG5ldyBFcnJvcigianNvblBhdGg6ICIrYS5tZXNzYWdlKyI6ICIrdCl9fSwkLmNhY2hlPXt9LCQudG9QYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dCxuPWUubGVuZ3RoO2xldCByPSIkIjtmb3IobGV0IGk9MTtpPG47aSsrKS9eKH58XF58QC4qP1woXCkpJC91LnRlc3QoZVtpXSl8fChyKz0vXlswLTkqXSskL3UudGVzdChlW2ldKT8iWyIrZVtpXSsiXSI6IlsnIitlW2ldKyInXSIpO3JldHVybiByfSwkLnRvUG9pbnRlcj1mdW5jdGlvbih0KXtjb25zdCBlPXQsbj1lLmxlbmd0aDtsZXQgcj0iIjtmb3IobGV0IGk9MTtpPG47aSsrKS9eKH58XF58QC4qP1woXCkpJC91LnRlc3QoZVtpXSl8fChyKz0iLyIrZVtpXS50b1N0cmluZygpLnJlcGxhY2VBbGwoIn4iLCJ+MCIpLnJlcGxhY2VBbGwoIi8iLCJ+MSIpKTtyZXR1cm4gcn0sJC50b1BhdGhBcnJheT1mdW5jdGlvbih0KXtjb25zdHtjYWNoZTplfT0kO2lmKGVbdF0pcmV0dXJuIGVbdF0uY29uY2F0KCk7Y29uc3Qgbj1bXSxpPXQucmVwbGFjZUFsbCgvQCg/Om51bGx8Ym9vbGVhbnxudW1iZXJ8c3RyaW5nfGludGVnZXJ8dW5kZWZpbmVkfG5vbkZpbml0ZXxzY2FsYXJ8YXJyYXl8b2JqZWN0fGZ1bmN0aW9ufG90aGVyKVwoXCkvZ3UsIjskJjsiKS5yZXBsYWNlQWxsKC9bWyddKFw/P1woLio/XCkpW1xdJ10oPyEuXF0pL2d1LGZ1bmN0aW9uKG8scyl7cmV0dXJuIlsjIisobi5wdXNoKHMpLTEpKyJdIn0pLnJlcGxhY2VBbGwoL1xbWyciXShbXidcXV0qKVsnIl1cXS9ndSxmdW5jdGlvbihvLHMpe3JldHVybiJbJyIrcy5yZXBsYWNlQWxsKCIuIiwiJUAlIikucmVwbGFjZUFsbCgifiIsIiUlQEAlJSIpKyInXSJ9KS5yZXBsYWNlQWxsKCJ+IiwiO347IikucmVwbGFjZUFsbCgvWyciXT9cLlsnIl0/KD8hW15bXSpcXSl8XFtbJyJdPy9ndSwiOyIpLnJlcGxhY2VBbGwoIiVAJSIsIi4iKS5yZXBsYWNlQWxsKCIlJUBAJSUiLCJ+IikucmVwbGFjZUFsbCgvKD86Oyk/KFxeKykoPzo7KT8vZ3UsZnVuY3Rpb24obyxzKXtyZXR1cm4iOyIrcy5zcGxpdCgiIikuam9pbigiOyIpKyI7In0pLnJlcGxhY2VBbGwoLzs7O3w7Oy9ndSwiOy4uOyIpLnJlcGxhY2VBbGwoLzskfCc/XF18JyQvZ3UsIiIpLnNwbGl0KCI7IikubWFwKGZ1bmN0aW9uKG8pe2NvbnN0IHM9by5tYXRjaCgvIyhcZCspL3UpO3JldHVybiFzfHwhc1sxXT9vOm5bc1sxXV19KTtyZXR1cm4gZVt0XT1pLGVbdF0uY29uY2F0KCl9LCQucHJvdG90eXBlLnNhZmVWbT17U2NyaXB0OmdmfTtjb25zdCBTZj1mdW5jdGlvbih0LGUsbil7Y29uc3Qgcj10Lmxlbmd0aDtmb3IobGV0IGk9MDtpPHI7aSsrKXtjb25zdCBvPXRbaV07bihvKSYmZS5wdXNoKHQuc3BsaWNlKGktLSwxKVswXSl9fTtjbGFzcyB3Zntjb25zdHJ1Y3RvcihlKXt0aGlzLmNvZGU9ZX1ydW5Jbk5ld0NvbnRleHQoZSl7bGV0IG49dGhpcy5jb2RlO2NvbnN0IHI9T2JqZWN0LmtleXMoZSksaT1bXTtTZihyLGksZj0+dHlwZW9mIGVbZl09PSJmdW5jdGlvbiIpO2NvbnN0IG89ci5tYXAoZj0+ZVtmXSk7bj1pLnJlZHVjZSgoZixkKT0+e2xldCBfPWVbZF0udG9TdHJpbmcoKTtyZXR1cm4vZnVuY3Rpb24vdS50ZXN0KF8pfHwoXz0iZnVuY3Rpb24gIitfKSwidmFyICIrZCsiPSIrXysiOyIrZn0sIiIpK24sIS8oWyciXSl1c2Ugc3RyaWN0XDEvdS50ZXN0KG4pJiYhci5pbmNsdWRlcygiYXJndW1lbnRzIikmJihuPSJ2YXIgYXJndW1lbnRzID0gdW5kZWZpbmVkOyIrbiksbj1uLnJlcGxhY2UoLztccyokL3UsIiIpO2NvbnN0IGg9bi5sYXN0SW5kZXhPZigiOyIpLGE9aCE9PS0xP24uc2xpY2UoMCxoKzEpKyIgcmV0dXJuICIrbi5zbGljZShoKzEpOiIgcmV0dXJuICIrbjtyZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLnIsYSkoLi4ubyl9fSQucHJvdG90eXBlLnZtPXtTY3JpcHQ6d2Z9O2NvbnN0IElmPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSIsQ2Y9dD0+QXJyYXkuZnJvbSh3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSh0KSkpLm1hcChlPT5JZltlJXRdKS5qb2luKCIiKS50b0xvd2VyQ2FzZSgpLHdpPXQ9PntpZih0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiB0O2Zvcihjb25zdCBlIGluIHQpaWYodHlwZW9mIHRbZV09PSJzdHJpbmciKXRyeXt0W2VdLnN0YXJ0c1dpdGgoInsiKSYmdFtlXS5lbmRzV2l0aCgifSIpJiYodFtlXT1KU09OLnBhcnNlKHRbZV0pKX1jYXRjaHtjb25zb2xlLmVycm9yKCJJbnZhbGlkIEpTT046Iix0W2VdKX1lbHNlIHR5cGVvZiB0W2VdPT0ib2JqZWN0IiYmKHRbZV09d2kodFtlXSkpO3JldHVybiB0fSxlcj0iY3ptXyI7ZnVuY3Rpb24gTmYodCxlKXtsZXQgbj10LHI9IiI7Y29uc3QgaT1bXTtsZXQgbz1uLmluZGV4T2YoIiR7Iik7Y29uc3Qgcz10eXBlb2YgZTwidSIsaD17fSxhPS9eXCQuLztmb3IoO28+PTA7KWlmKE1mKG4sbykpe2NvbnN0IGY9RmYobixvKTtyKz1uLnNsaWNlKDAsZisxKSxuPW4uc2xpY2UoZisxKSxvPW4uaW5kZXhPZigiJHsiKX1lbHNle3IrPW4uc2xpY2UoMCxvKTtjb25zdCBmPUxmKG4sbyksZD1uLnNsaWNlKG8rMixmKTtpZihhLnRlc3QoZCkpe2lmKCFzKXJldHVybltyLFtdXTtsZXQgXz1oW2RdO2lmKCFfKXRyeXtfPSQoe2pzb246ZSxwYXRoOmR9KSxoW2RdPV99Y2F0Y2h7cmV0dXJuW3IsW11dfWlmKF8ubGVuZ3RoIT09MCl7Y29uc3QgUz1DZigxMCk7aS5wdXNoKHtsaXRlcmFsTmFtZTpTLGxpdGVyYWxWYWx1ZTpfWzBdfSkscis9U31lbHNlIHJldHVyblsiZmFsc2UiLFtdXX1lbHNle2NvbnN0IF89UGYoZCk7cis9YCR7ZXJ9JHtffWB9bj1uLnNsaWNlKGYrMSksbz1uLmluZGV4T2YoIiR7Iil9cmV0dXJuIHIrPW4sW3IsaV19ZnVuY3Rpb24gTWYodCxlKXtjb25zdCBuPXQuaW5kZXhPZigiJyIpLHI9dC5pbmRleE9mKCciJyk7cmV0dXJuIG4+PTAmJm48ZT90LmluZGV4T2YoIiciLG4rMSk+PWU6cj49MCYmcjxlP3QuaW5kZXhPZignIicscisxKT49ZTohMX1mdW5jdGlvbiBGZih0LGUpe2NvbnN0IG49dC5pbmRleE9mKCInIikscj10LmluZGV4T2YoJyInKTtyZXR1cm4gbj49MCYmbjxlP3QuaW5kZXhPZigiJyIsbisxKTpyPj0wJiZyPGU/dC5pbmRleE9mKCciJyxyKzEpOi0xfWZ1bmN0aW9uIExmKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoIn0iLGUpO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoInJlcGxhY2VWYXJpYWJsZTogVW5tYXRjaGVkIHsuIik7cmV0dXJuIG59Y29uc3QgdWU9dD0+YCRyZWVhcnRoXyR7dH1fJGAsbnI9eyJbIjp1ZSgib3BlbmVkX3NxdWFyZV9icmFja2V0IiksIl0iOnVlKCJjbG9zZWRfc3F1YXJlX2JyYWNrZXQiKSwieyI6dWUoIm9wZW5lZF9jdXJseV9icmFja2V0IiksIn0iOnVlKCJjbG9zZWRfY3VybHlfYnJhY2tldCIpLCIoIjp1ZSgib3BlbmVkX3BhcmVudGhlc2VzIiksIikiOnVlKCJjbG9zZWRfcGFyZW50aGVzZXMiKSwiLSI6dWUoImh5cGhlbiIpfSxQZj10PT57Y29uc3QgZT10LnJlcGxhY2UoLy0vZyxuclsiLSJdKTtyZXR1cm4vKFxdfFwpfFx9KVteWy5dKyQvLnRlc3QoZSk/T2JqZWN0LmVudHJpZXMobnIpLnJlZHVjZSgobixbcixpXSk9Pm4ucmVwbGFjZUFsbChyLGkpLGUpOmV9LHZmPXQ9Pk9iamVjdC5lbnRyaWVzKG5yKS5yZWR1Y2UoKGUsW24scl0pPT5lLnJlcGxhY2VBbGwocixuKSx0KSxEZj1uZXcgU2V0KFp1KSxJaT1uZXcgU2V0KFF1KTtmdW5jdGlvbiBWKHQsZSl7bGV0IG49bmV3IEVycm9yKCJmYWlsZWQgdG8gcGFyc2UiKTtjb25zdCByPWUudHlwZTtpZihyPT09IkxpdGVyYWwiKW49QmYoZSk7ZWxzZSBpZihyPT09IkNhbGxFeHByZXNzaW9uIiluPWpmKHQsZSk7ZWxzZSBpZihyPT09IklkZW50aWZpZXIiKW49R2YoZSk7ZWxzZSBpZihyPT09IlVuYXJ5RXhwcmVzc2lvbiIpe2NvbnN0IGk9ZS5vcGVyYXRvcixvPVYodCxlLmFyZ3VtZW50KTtpZihEZi5oYXMoaSkpbj1uZXcgRChGLlVOQVJZLGksbyk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0b3IgIiR7aX0iLmApfWVsc2UgaWYocj09PSJCaW5hcnlFeHByZXNzaW9uIil7Y29uc3QgaT1lLm9wZXJhdG9yLG89Vih0LGUubGVmdCkscz1WKHQsZS5yaWdodCk7aWYoSWkuaGFzKGkpKW49bmV3IEQoRi5CSU5BUlksaSxvLHMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yICIke2l9Ii5gKX1lbHNlIGlmKHI9PT0iTG9naWNhbEV4cHJlc3Npb24iKXtjb25zdCBpPWUub3BlcmF0b3Isbz1WKHQsZS5sZWZ0KSxzPVYodCxlLnJpZ2h0KTtJaS5oYXMoaSkmJihuPW5ldyBEKEYuQklOQVJZLGksbyxzKSl9ZWxzZSBpZihyPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIpe2NvbnN0IGk9Vih0LGUudGVzdCksbz1WKHQsZS5jb25zZXF1ZW50KSxzPVYodCxlLmFsdGVybmF0ZSk7bj1uZXcgRChGLkNPTkRJVElPTkFMLCI/IixvLHMsaSl9ZWxzZSBpZihyPT09Ik1lbWJlckV4cHJlc3Npb24iKW49VmYodCxlKTtlbHNlIGlmKHI9PT0iQXJyYXlFeHByZXNzaW9uIil7Y29uc3QgaT1bXTtmb3IobGV0IG89MDtvPGUuZWxlbWVudHMubGVuZ3RoO28rKylpW29dPVYodCxlLmVsZW1lbnRzW29dKTtuPW5ldyBEKEYuQVJSQVksaSl9ZWxzZSB0aHJvdyByPT09IkNvbXBvdW5kIj9uZXcgRXJyb3IoIlByb3ZpZGUgZXhhY3RseSBvbmUgZXhwcmVzc2lvbi4iKTpuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBleHByZXNzaW9uLiIpO3JldHVybiBufWZ1bmN0aW9uIEJmKHQpe2NvbnN0IGU9dHlwZW9mIHQudmFsdWU7aWYodC52YWx1ZT09PW51bGwpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVUxMLG51bGwpO2lmKGU9PT0iYm9vbGVhbiIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9CT09MRUFOLHQudmFsdWUpO2lmKGU9PT0ibnVtYmVyIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUix0LnZhbHVlKTtpZihlPT09InN0cmluZyIpcmV0dXJuIHQudmFsdWUuaW5kZXhPZigiJHsiKT49MD9uZXcgRChGLlZBUklBQkxFX0lOX1NUUklORyx0LnZhbHVlKTpuZXcgRChGLkxJVEVSQUxfU1RSSU5HLFVmKHQudmFsdWUpKTt0aHJvdyBuZXcgRXJyb3IoYCR7dH0gaXMgbm90IGEgZnVuY3Rpb24uYCl9ZnVuY3Rpb24gVWYodCl7cmV0dXJuIHQucmVwbGFjZShlZiwiXFwiKX1mdW5jdGlvbiBqZih0LGUpe2NvbnN0IG49ZS5hcmd1bWVudHMscj1uLmxlbmd0aDtpZihlLmNhbGxlZS50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iKXtjb25zdCBvPWUuY2FsbGVlLnByb3BlcnR5Lm5hbWUscz1lLmNhbGxlZS5vYmplY3Q7aWYobz09PSJ0ZXN0Inx8bz09PSJleGVjIil7aWYocy5jYWxsZWUubmFtZSE9PSJyZWdFeHAiKXRocm93IG5ldyBFcnJvcihgJHtvfSBpcyBub3QgYSBmdW5jdGlvbi5gKTtpZihyPT09MClyZXR1cm4gbz09PSJ0ZXN0Ij9uZXcgRChGLkxJVEVSQUxfQk9PTEVBTiwhMSk6bmV3IEQoRi5MSVRFUkFMX05VTEwsbnVsbCk7Y29uc3QgaD1WKHQscyksYT1WKHQsblswXSk7cmV0dXJuIG5ldyBEKEYuRlVOQ1RJT05fQ0FMTCxvLGgsYSl9ZWxzZSBpZihvPT09InRvU3RyaW5nIil7Y29uc3QgaD1WKHQscyk7cmV0dXJuIG5ldyBEKEYuRlVOQ1RJT05fQ0FMTCxvLGgpfXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke299Ii5gKX1jb25zdCBpPWUuY2FsbGVlLm5hbWU7aWYoaT09PSJjb2xvciIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfQ09MT1IsaSk7Y29uc3Qgbz1WKHQsblswXSk7aWYodHlwZW9mIG5bMV08InUiKXtjb25zdCBzPVYodCxuWzFdKTtyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0NPTE9SLGksW28sc10pfXJldHVybiBuZXcgRChGLkxJVEVSQUxfQ09MT1IsaSxbb10pfWVsc2UgaWYoaT09PSJyZ2IifHxpPT09ImhzbCIpe2lmKHI8Myl0aHJvdyBuZXcgRXJyb3IoYCR7aX0gcmVxdWlyZXMgdGhyZWUgYXJndW1lbnRzLmApO2NvbnN0IG89W1YodCxuWzBdKSxWKHQsblsxXSksVih0LG5bMl0pXTtyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0NPTE9SLGksbyl9ZWxzZSBpZihpPT09InJnYmEifHxpPT09ImhzbGEiKXtpZihyPDQpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGZvdXIgYXJndW1lbnRzLmApO2NvbnN0IG89W1YodCxuWzBdKSxWKHQsblsxXSksVih0LG5bMl0pLFYodCxuWzNdKV07cmV0dXJuIG5ldyBEKEYuTElURVJBTF9DT0xPUixpLG8pfWVsc2UgaWYoaT09PSJpc05hTiJ8fGk9PT0iaXNGaW5pdGUiKXtpZihyPT09MClyZXR1cm4gaT09PSJpc05hTiI/bmV3IEQoRi5MSVRFUkFMX0JPT0xFQU4sITApOm5ldyBEKEYuTElURVJBTF9CT09MRUFOLCExKTtjb25zdCBvPVYodCxuWzBdKTtyZXR1cm4gbmV3IEQoRi5VTkFSWSxpLG8pfWVsc2UgaWYodHlwZW9mIFpuW2ldPCJ1Iil7aWYociE9PTEpdGhyb3cgbmV3IEVycm9yKGAke2l9IHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LmApO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZih0eXBlb2YgWW5baV08InUiKXtpZihyIT09Mil0aHJvdyBuZXcgRXJyb3IoYCR7aX0gcmVxdWlyZXMgZXhhY3RseSB0d28gYXJndW1lbnRzLmApO2NvbnN0IG89Vih0LG5bMF0pLHM9Vih0LG5bMV0pO3JldHVybiBuZXcgRChGLkJJTkFSWSxpLG8scyl9ZWxzZSBpZihpPT09IkJvb2xlYW4iKXtpZihyPT09MClyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX0JPT0xFQU4sITEpO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZihpPT09Ik51bWJlciIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfTlVNQkVSLDApO2NvbnN0IG89Vih0LG5bMF0pO3JldHVybiBuZXcgRChGLlVOQVJZLGksbyl9ZWxzZSBpZihpPT09IlN0cmluZyIpe2lmKHI9PT0wKXJldHVybiBuZXcgRChGLkxJVEVSQUxfU1RSSU5HLCIiKTtjb25zdCBvPVYodCxuWzBdKTtyZXR1cm4gbmV3IEQoRi5VTkFSWSxpLG8pfXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmdW5jdGlvbiBjYWxsICIke2l9Ii5gKX1mdW5jdGlvbiBHZih0KXtjb25zdCBlPXQubmFtZTtpZihYZihlKSl7Y29uc3Qgbj1XZihlKTtyZXR1cm4gbi5zdWJzdHJpbmcoMCw4KT09PSJ0aWxlczNkXyI/bmV3IEQoRi5CVUlMVElOX1ZBUklBQkxFLG4pOm5ldyBEKEYuVkFSSUFCTEUsbil9ZWxzZXtpZihlPT09Ik5hTiIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVU1CRVIsTmFOKTtpZihlPT09IkluZmluaXR5IilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUiwxLzApO2lmKGU9PT0idW5kZWZpbmVkIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX1VOREVGSU5FRCx2b2lkIDApfXRocm93IG5ldyBFcnJvcihgJHtlfSBpcyBub3QgZGVmaW5lZC5gKX1mdW5jdGlvbiAkZih0KXtjb25zdCBlPXQucHJvcGVydHkubmFtZTtpZihlPT09IlBJIilyZXR1cm4gbmV3IEQoRi5MSVRFUkFMX05VTUJFUixNYXRoLlBJKTtpZihlPT09IkUiKXJldHVybiBuZXcgRChGLkxJVEVSQUxfTlVNQkVSLE1hdGguRSk7dGhyb3cgbmV3IEVycm9yKGAke2V9IE1hdGggQ29uc3RhbnQgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50YCl9ZnVuY3Rpb24ga2YodCl7Y29uc3QgZT10LnByb3BlcnR5Lm5hbWU7aWYoZT09PSJQT1NJVElWRV9JTkZJTklUWSIpcmV0dXJuIG5ldyBEKEYuTElURVJBTF9OVU1CRVIsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gTnVtYmVyIENvbnN0YW50IGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudGApfWZ1bmN0aW9uIFZmKHQsZSl7aWYoZS5vYmplY3QubmFtZT09PSJNYXRoIilyZXR1cm4gJGYoZSk7aWYoZS5vYmplY3QubmFtZT09PSJOdW1iZXIiKXJldHVybiBrZihlKTtsZXQgbjtjb25zdCByPVYodCxlLm9iamVjdCk7cmV0dXJuIGUuY29tcHV0ZWQ/KG49Vih0LGUucHJvcGVydHkpLG5ldyBEKEYuTUVNQkVSLCJicmFja2V0cyIscixuKSk6KG49bmV3IEQoRi5MSVRFUkFMX1NUUklORyxlLnByb3BlcnR5Lm5hbWUpLG5ldyBEKEYuTUVNQkVSLCJkb3QiLHIsbikpfWZ1bmN0aW9uIFhmKHQpe3JldHVybiB0LnN1YnN0cmluZygwLDQpPT09ZXJ9ZnVuY3Rpb24gV2YodCl7cmV0dXJuIHZmKHQpLnN1YnN0cmluZyg0KX1jb25zdCBDaT1uZXcgTWFwLE5pPW5ldyBNYXAsTWk9bmV3IE1hcCxGaT1uZXcgTWFwO2NsYXNzIGZue2NvbnN0cnVjdG9yKGUsbixyKXtMKHRoaXMsIl9ydW50aW1lQXN0Iik7TCh0aGlzLCJfZmVhdHVyZSIpO3ZhciBoO3RoaXMuX2ZlYXR1cmU9bjtsZXQgaT1bXTtlPXpmKGUscik7Y29uc3Qgbz1OaS5nZXQoZSk7aWYobylbZSxpXT1vO2Vsc2V7Y29uc3QgYT1lO1tlLGldPU5mKEhmKGUpLChoPXRoaXMuX2ZlYXR1cmUpPT1udWxsP3ZvaWQgMDpoLnByb3BlcnRpZXMpLGUuaW5jbHVkZXMoZXIpJiZOaS5zZXQoYSxbZSxpXSl9Y29uc3Qgcz1DaS5nZXQoZSk7aWYocyl0aGlzLl9ydW50aW1lQXN0PXM7ZWxzZXtpZihpLmxlbmd0aCE9PTApZm9yKGNvbnN0IGYgb2YgaSlRdC5hZGRMaXRlcmFsKGYubGl0ZXJhbE5hbWUsZi5saXRlcmFsVmFsdWUpO1F0LmFkZEJpbmFyeU9wKCI9fiIsMCksUXQuYWRkQmluYXJ5T3AoIiF+IiwwKTtsZXQgYTt0cnl7YT1RdChlKX1jYXRjaChmKXt0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBnZW5lcmF0ZSBhc3Q6ICR7Zn1gKX10aGlzLl9ydW50aW1lQXN0PVYodGhpcyxhKSxDaS5zZXQoZSx0aGlzLl9ydW50aW1lQXN0KX19ZXZhbHVhdGUoKXtyZXR1cm4gdGhpcy5fcnVudGltZUFzdC5ldmFsdWF0ZSh0aGlzLl9mZWF0dXJlKX19ZnVuY3Rpb24gemYodCxlKXtpZih0eXBlb2YgZT4idSIpcmV0dXJuIHQ7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShPYmplY3QuZW50cmllcyhlKS5zb3J0KCkpLHI9dCtuLGk9RmkuZ2V0KHIpO2lmKGkpcmV0dXJuIGk7bGV0IG89TWkuZ2V0KHQpO298fChvPW5ldyBSZWdFeHAoYFxcJFxceygke09iamVjdC5rZXlzKGUpLmpvaW4oInwiKX0pXFx9YCwiZyIpLE1pLnNldCh0LG8pKTtjb25zdCBzPXQucmVwbGFjZShvLChoLGEpPT50eXBlb2YgZVthXTwidSI/YCgke2VbYV19KWA6IiIpO3JldHVybiBGaS5zZXQocixzKSxzfWZ1bmN0aW9uIEhmKHQpe3JldHVybiB0LnJlcGxhY2UoSnUsdGYpfWNsYXNzIHFme2NvbnN0cnVjdG9yKGUsbixyKXtMKHRoaXMsIl9jb25kaXRpb25zIik7TCh0aGlzLCJfcnVudGltZUNvbmRpdGlvbnMiKTtMKHRoaXMsIl9mZWF0dXJlIik7TCh0aGlzLCJfbWVtb2l6ZWRSZXN1bHQiKTt0aGlzLl9jb25kaXRpb25zPWUuY29uZGl0aW9ucyx0aGlzLl9ydW50aW1lQ29uZGl0aW9ucz1bXSx0aGlzLl9mZWF0dXJlPW4sdGhpcy5fbWVtb2l6ZWRSZXN1bHQ9dm9pZCAwLHRoaXMuc2V0UnVudGltZShyKX1zZXRSdW50aW1lKGUpe3ZhciByO2NvbnN0IG49KHI9dGhpcy5fY29uZGl0aW9ucyk9PW51bGw/dm9pZCAwOnIubWFwKGk9Pntjb25zdCBvPVN0cmluZyhpWzBdKSxzPVN0cmluZyhpWzFdKTtyZXR1cm4gbmV3IEtmKG5ldyBmbihvLHRoaXMuX2ZlYXR1cmUsZSksbmV3IGZuKHMsdGhpcy5fZmVhdHVyZSxlKSl9KTt0aGlzLl9ydW50aW1lQ29uZGl0aW9ucz1uPz9bXSx0aGlzLl9tZW1vaXplZFJlc3VsdD12b2lkIDB9ZXZhbHVhdGUoKXtpZih0eXBlb2YgdGhpcy5fbWVtb2l6ZWRSZXN1bHQ8InUiKXJldHVybiB0aGlzLl9tZW1vaXplZFJlc3VsdDtjb25zdCBlPXRoaXMuX3J1bnRpbWVDb25kaXRpb25zLG49ZS5sZW5ndGg7Zm9yKGxldCBpPTA7aTxuO2krKyl7Y29uc3Qgbz1lW2ldO2lmKG8uY29uZGl0aW9uLmV2YWx1YXRlKCkpe2NvbnN0IHM9by5leHByZXNzaW9uLmV2YWx1YXRlKCk7cmV0dXJuIHRoaXMuX21lbW9pemVkUmVzdWx0PXMsc319Y29uc3Qgcj12b2lkIDA7cmV0dXJuIHRoaXMuX21lbW9pemVkUmVzdWx0PXIscn19Y2xhc3MgS2Z7Y29uc3RydWN0b3IoZSxuKXtMKHRoaXMsImNvbmRpdGlvbiIpO0wodGhpcywiZXhwcmVzc2lvbiIpO3RoaXMuY29uZGl0aW9uPWUsdGhpcy5leHByZXNzaW9uPW59fWNvbnN0IFlmPSh0LGUsbik9Pntjb25zdCByPUJ1KHQsWHUpLGk9ZWwodCxlKTtyZXR1cm57Li4uaSwuLi5aZihyLHQsaSksdHlwZToiY29tcHV0ZWRGZWF0dXJlIixpbnRlcnZhbDpufX07ZnVuY3Rpb24gWmYodCxlLG4pe2lmKCFuKXtpZighZS5pZCl0aHJvdyBuZXcgRXJyb3IoImxheWVyIGlkIGlzIHJlcXVpcmVkIik7bj17dHlwZToiZmVhdHVyZSIsaWQ6ZS5pZCxwcm9wZXJ0aWVzOmUucHJvcGVydGllc3x8e319fXJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbcixpXSk9Pmk/W3IsTGkoaSxlLG4pXTp2b2lkIDApLmZpbHRlcihyPT4hIXIpKX1mdW5jdGlvbiBMaSh0LGUsbil7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoKFtyLGldKT0+SmYoaSk/W3IsTGkoaSxlLG4pXTpbcix0bChpLGUsbildKSl9ZnVuY3Rpb24gUWYodCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmdCYmImV4cHJlc3Npb24iaW4gdH1mdW5jdGlvbiBKZih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJvYmplY3QiJiZ0JiYhKCJleHByZXNzaW9uImluIHQpJiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB0bCh0LGUsbil7dHJ5e2lmKFFmKHQpKXtjb25zdCByPXQuZXhwcmVzc2lvbixpPXdpKEN1KG4pKTtyZXR1cm4gdHlwZW9mIHI+InUiP3ZvaWQgMDp0eXBlb2Ygcj09Im9iamVjdCImJnIuY29uZGl0aW9ucz9uZXcgcWYocixpLGUuZGVmaW5lcykuZXZhbHVhdGUoKTp0eXBlb2Ygcj09ImJvb2xlYW4ifHx0eXBlb2Ygcj09Im51bWJlciI/bmV3IGZuKFN0cmluZyhyKSxpLGUuZGVmaW5lcykuZXZhbHVhdGUoKTp0eXBlb2Ygcj09InN0cmluZyI/bmV3IGZuKHIsaSxlLmRlZmluZXMpLmV2YWx1YXRlKCk6cn1yZXR1cm4gdH1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpO3JldHVybn19ZnVuY3Rpb24gZWwodCxlKXt2YXIgaTtjb25zdCBuPShpPXQuZGF0YSk9PW51bGw/dm9pZCAwOmkuanNvblByb3BlcnRpZXM7aWYoIWUucHJvcGVydGllc3x8IW58fCFuLmxlbmd0aClyZXR1cm4gZTtjb25zdCByPXsuLi5lLC4uLmUhPW51bGwmJmUucHJvcGVydGllcz97cHJvcGVydGllczp7Li4uZS5wcm9wZXJ0aWVzfX06e319O3JldHVybiBuLmZvckVhY2gobz0+e3IucHJvcGVydGllc1tvXT0oKCk9Pntjb25zdCBzPXIucHJvcGVydGllc1tvXTt0cnl7cmV0dXJuIEpTT04ucGFyc2Uocyl9Y2F0Y2h7cmV0dXJuIHN9fSkoKX0pLHJ9ZnVuY3Rpb24gbG4odCxlKXtpZih0LnR5cGU9PT0ic2ltcGxlIilyZXR1cm4gWWYodCxlKX1jb25zdCBubD0odCxlLG4pPT57aWYoIW4pcmV0dXJuO2NvbnN0IHI9KCgpPT57c3dpdGNoKFh0LnR5cGVzW3QudHlwZV0pe2Nhc2UiUG9seWdvbiI6cmV0dXJuInBvbHlnb24iO2Nhc2UiTGluZVN0cmluZyI6cmV0dXJuInBvbHlsaW5lIjtjYXNlIlBvaW50IjpyZXR1cm4ibWFya2VyIjtkZWZhdWx0OnJldHVybn19KSgpO2lmKCFyKXJldHVybjtjb25zdCBpPXQuaWQ/U3RyaW5nKHQuaWQpOnJsKHQubG9hZEdlb21ldHJ5KCksZSksbz1sbihuLGlsKGksdCxlLHIpKSxzPW5ldyBTbjtyZXR1cm4gcy5kYXRhPXtsYXllcklkOm49PW51bGw/dm9pZCAwOm4uaWQsZmVhdHVyZUlkOmksZmVhdHVyZTpvLGFwcGVhcmFuY2VUeXBlOlh0LnR5cGVzW3QudHlwZV0udG9Mb3dlckNhc2UoKX0sc30scmw9KHQsZSk9Pntjb25zdCBuPVtlLngsZS55LGUubGV2ZWwsLi4udC5mbGF0TWFwKHI9PnIubWFwKGk9PltpLngsaS55XSkpXS5qb2luKCI6Iik7cmV0dXJuIFZ1KG4pfSxpbD0odCxlLG4scik9Pntjb25zdCBpPWUubG9hZEdlb21ldHJ5KCksW28sc109KCgpPT57aWYocj09PSJwb2x5Z29uIilyZXR1cm5bIlBvbHlnb24iLGkubWFwKGg9PmgubWFwKGE9PlthLngsYS55XSkpXTtpZihyPT09InBvbHlsaW5lIilyZXR1cm5bIkxpbmVTdHJpbmciLGlbMF0ubWFwKGg9PltoLngsaC55XSldO2lmKHI9PT0ibWFya2VyIilyZXR1cm5bIlBvaW50IixbaVswXVswXS54LGlbMF1bMF0ueV1dO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcHBlYXJhbmNlICR7cn1gKX0pKCk7cmV0dXJue3R5cGU6ImZlYXR1cmUiLGlkOnQsZ2VvbWV0cnk6e3R5cGU6byxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOmUucHJvcGVydGllcyxyYW5nZTp7eDpuLngseTpuLnksejpuLmxldmVsfX19LEllPXR5cGVvZiBwZXJmb3JtYW5jZT09Im9iamVjdCImJnBlcmZvcm1hbmNlJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iP3BlcmZvcm1hbmNlOkRhdGUsUGk9bmV3IFNldCxycj10eXBlb2YgcHJvY2Vzcz09Im9iamVjdCImJnByb2Nlc3M/cHJvY2Vzczp7fSx2aT0odCxlLG4scik9Pnt0eXBlb2YgcnIuZW1pdFdhcm5pbmc9PSJmdW5jdGlvbiI/cnIuZW1pdFdhcm5pbmcodCxlLG4scik6Y29uc29sZS5lcnJvcihgWyR7bn1dICR7ZX06ICR7dH1gKX07bGV0IGRuPWdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyLERpPWdsb2JhbFRoaXMuQWJvcnRTaWduYWw7aWYodHlwZW9mIGRuPiJ1Iil7RGk9Y2xhc3N7Y29uc3RydWN0b3IoKXtMKHRoaXMsIm9uYWJvcnQiKTtMKHRoaXMsIl9vbmFib3J0IixbXSk7TCh0aGlzLCJyZWFzb24iKTtMKHRoaXMsImFib3J0ZWQiLCExKX1hZGRFdmVudExpc3RlbmVyKHIsaSl7dGhpcy5fb25hYm9ydC5wdXNoKGkpfX0sZG49Y2xhc3N7Y29uc3RydWN0b3IoKXtMKHRoaXMsInNpZ25hbCIsbmV3IERpKTtlKCl9YWJvcnQocil7dmFyIGksbztpZighdGhpcy5zaWduYWwuYWJvcnRlZCl7dGhpcy5zaWduYWwucmVhc29uPXIsdGhpcy5zaWduYWwuYWJvcnRlZD0hMDtmb3IoY29uc3QgcyBvZiB0aGlzLnNpZ25hbC5fb25hYm9ydClzKHIpOyhvPShpPXRoaXMuc2lnbmFsKS5vbmFib3J0KT09bnVsbHx8by5jYWxsKGkscil9fX07bGV0IHQ9KChraT1yci5lbnYpPT1udWxsP3ZvaWQgMDpraS5MUlVfQ0FDSEVfSUdOT1JFX0FDX1dBUk5JTkcpIT09IjEiO2NvbnN0IGU9KCk9Pnt0JiYodD0hMSx2aSgiQWJvcnRDb250cm9sbGVyIGlzIG5vdCBkZWZpbmVkLiBJZiB1c2luZyBscnUtY2FjaGUgaW4gbm9kZSAxNCwgbG9hZCBhbiBBYm9ydENvbnRyb2xsZXIgcG9seWZpbGwgZnJvbSB0aGUgYG5vZGUtYWJvcnQtY29udHJvbGxlcmAgcGFja2FnZS4gQSBtaW5pbWFsIHBvbHlmaWxsIGlzIHByb3ZpZGVkIGZvciB1c2UgYnkgTFJVQ2FjaGUuZmV0Y2goKSwgYnV0IGl0IHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24gaW4gb3RoZXIgY29udGV4dHMgKGVnLCBwYXNzaW5nIGl0IHRvIG90aGVyIEFQSXMgdGhhdCB1c2UgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cykuIFlvdSBtYXkgZGlzYWJsZSB0aGlzIHdpdGggTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HPTEgaW4gdGhlIGVudi4iLCJOT19BQk9SVF9DT05UUk9MTEVSIiwiRU5PVFNVUCIsZSkpfX1jb25zdCBvbD10PT4hUGkuaGFzKHQpLHRlPXQ9PnQmJnQ9PT1NYXRoLmZsb29yKHQpJiZ0PjAmJmlzRmluaXRlKHQpLEJpPXQ9PnRlKHQpP3Q8PU1hdGgucG93KDIsOCk/VWludDhBcnJheTp0PD1NYXRoLnBvdygyLDE2KT9VaW50MTZBcnJheTp0PD1NYXRoLnBvdygyLDMyKT9VaW50MzJBcnJheTp0PD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUj9FbjpudWxsOm51bGw7Y2xhc3MgRW4gZXh0ZW5kcyBBcnJheXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmZpbGwoMCl9fWNvbnN0IE5lPWNsYXNze2NvbnN0cnVjdG9yKGUsbil7TCh0aGlzLCJoZWFwIik7TCh0aGlzLCJsZW5ndGgiKTtpZighYyhOZSxDZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5zdGFudGlhdGUgU3RhY2sgdXNpbmcgU3RhY2suY3JlYXRlKG4pIik7dGhpcy5oZWFwPW5ldyBuKGUpLHRoaXMubGVuZ3RoPTB9c3RhdGljIGNyZWF0ZShlKXtjb25zdCBuPUJpKGUpO2lmKCFuKXJldHVybltdO1AoTmUsQ2UsITApO2NvbnN0IHI9bmV3IE5lKGUsbik7cmV0dXJuIFAoTmUsQ2UsITEpLHJ9cHVzaChlKXt0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK109ZX1wb3AoKXtyZXR1cm4gdGhpcy5oZWFwWy0tdGhpcy5sZW5ndGhdfX07bGV0IF9uPU5lO0NlPW5ldyBXZWFrTWFwLEIoX24sQ2UsITEpO2NvbnN0IG9yPWNsYXNze2NvbnN0cnVjdG9yKGUpe0IodGhpcyxrZSk7Qih0aGlzLHBuKTtCKHRoaXMsJHQpO0IodGhpcyxrdCk7Qih0aGlzLFdlKTtCKHRoaXMsTGUpO0IodGhpcyxQZSk7Qih0aGlzLFkpO0IodGhpcyx6ZSk7Qih0aGlzLGRlKTtCKHRoaXMsQ3Qsdm9pZCAwKTtCKHRoaXMsT3Qsdm9pZCAwKTtCKHRoaXMsTnQsdm9pZCAwKTtCKHRoaXMsTXQsdm9pZCAwKTtCKHRoaXMsTWUsdm9pZCAwKTtMKHRoaXMsInR0bCIpO0wodGhpcywidHRsUmVzb2x1dGlvbiIpO0wodGhpcywidHRsQXV0b3B1cmdlIik7TCh0aGlzLCJ1cGRhdGVBZ2VPbkdldCIpO0wodGhpcywidXBkYXRlQWdlT25IYXMiKTtMKHRoaXMsImFsbG93U3RhbGUiKTtMKHRoaXMsIm5vRGlzcG9zZU9uU2V0Iik7TCh0aGlzLCJub1VwZGF0ZVRUTCIpO0wodGhpcywibWF4RW50cnlTaXplIik7TCh0aGlzLCJzaXplQ2FsY3VsYXRpb24iKTtMKHRoaXMsIm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiIpO0wodGhpcywibm9EZWxldGVPblN0YWxlR2V0Iik7TCh0aGlzLCJhbGxvd1N0YWxlT25GZXRjaEFib3J0Iik7TCh0aGlzLCJhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiIpO0wodGhpcywiaWdub3JlRmV0Y2hBYm9ydCIpO0IodGhpcyxodCx2b2lkIDApO0IodGhpcyxGdCx2b2lkIDApO0IodGhpcyxhdCx2b2lkIDApO0IodGhpcyxldCx2b2lkIDApO0IodGhpcyx2LHZvaWQgMCk7Qih0aGlzLF90LHZvaWQgMCk7Qih0aGlzLFR0LHZvaWQgMCk7Qih0aGlzLEV0LHZvaWQgMCk7Qih0aGlzLGZ0LHZvaWQgMCk7Qih0aGlzLEx0LHZvaWQgMCk7Qih0aGlzLGx0LHZvaWQgMCk7Qih0aGlzLFB0LHZvaWQgMCk7Qih0aGlzLHZ0LHZvaWQgMCk7Qih0aGlzLFJ0LHZvaWQgMCk7Qih0aGlzLER0LHZvaWQgMCk7Qih0aGlzLGVlLHZvaWQgMCk7Qih0aGlzLHB0LHZvaWQgMCk7Qih0aGlzLGZlLCgpPT57fSk7Qih0aGlzLHF0LCgpPT57fSk7Qih0aGlzLFZlLCgpPT57fSk7Qih0aGlzLGJ0LCgpPT4hMSk7Qih0aGlzLGxlLGU9Pnt9KTtCKHRoaXMsRmUsKGUsbixyKT0+e30pO0IodGhpcyxYZSwoZSxuLHIsaSk9PntpZihyfHxpKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbm5vdCBzZXQgc2l6ZSB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgb24gY2FjaGUiKTtyZXR1cm4gMH0pO0wodGhpcyxUbCwiTFJVQ2FjaGUiKTtjb25zdHttYXg6bj0wLHR0bDpyLHR0bFJlc29sdXRpb246aT0xLHR0bEF1dG9wdXJnZTpvLHVwZGF0ZUFnZU9uR2V0OnMsdXBkYXRlQWdlT25IYXM6aCxhbGxvd1N0YWxlOmEsZGlzcG9zZTpmLGRpc3Bvc2VBZnRlcjpkLG5vRGlzcG9zZU9uU2V0Ol8sbm9VcGRhdGVUVEw6UyxtYXhTaXplOk89MCxtYXhFbnRyeVNpemU6dz0wLHNpemVDYWxjdWxhdGlvbjpiLGZldGNoTWV0aG9kOk0sbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOm0sbm9EZWxldGVPblN0YWxlR2V0OkcsYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246USxhbGxvd1N0YWxlT25GZXRjaEFib3J0OkgsaWdub3JlRmV0Y2hBYm9ydDppdH09ZTtpZihuIT09MCYmIXRlKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiKTtjb25zdCB5dD1uP0JpKG4pOkFycmF5O2lmKCF5dCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbWF4IHZhbHVlOiAiK24pO2lmKFAodGhpcyxDdCxuKSxQKHRoaXMsT3QsTyksdGhpcy5tYXhFbnRyeVNpemU9d3x8Yyh0aGlzLE90KSx0aGlzLnNpemVDYWxjdWxhdGlvbj1iLHRoaXMuc2l6ZUNhbGN1bGF0aW9uKXtpZighYyh0aGlzLE90KSYmIXRoaXMubWF4RW50cnlTaXplKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSIpO2lmKHR5cGVvZiB0aGlzLnNpemVDYWxjdWxhdGlvbiE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gc2V0IHRvIG5vbi1mdW5jdGlvbiIpfWlmKE0hPT12b2lkIDAmJnR5cGVvZiBNIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImZldGNoTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQiKTtpZihQKHRoaXMsTWUsTSksUCh0aGlzLGVlLCEhTSksUCh0aGlzLGF0LG5ldyBNYXApLFAodGhpcyxldCxuZXcgQXJyYXkobikuZmlsbCh2b2lkIDApKSxQKHRoaXMsdixuZXcgQXJyYXkobikuZmlsbCh2b2lkIDApKSxQKHRoaXMsX3QsbmV3IHl0KG4pKSxQKHRoaXMsVHQsbmV3IHl0KG4pKSxQKHRoaXMsRXQsMCksUCh0aGlzLGZ0LDApLFAodGhpcyxMdCxfbi5jcmVhdGUobikpLFAodGhpcyxodCwwKSxQKHRoaXMsRnQsMCksdHlwZW9mIGY9PSJmdW5jdGlvbiImJlAodGhpcyxOdCxmKSx0eXBlb2YgZD09ImZ1bmN0aW9uIj8oUCh0aGlzLE10LGQpLFAodGhpcyxsdCxbXSkpOihQKHRoaXMsTXQsdm9pZCAwKSxQKHRoaXMsbHQsdm9pZCAwKSksUCh0aGlzLER0LCEhYyh0aGlzLE50KSksUCh0aGlzLHB0LCEhYyh0aGlzLE10KSksdGhpcy5ub0Rpc3Bvc2VPblNldD0hIV8sdGhpcy5ub1VwZGF0ZVRUTD0hIVMsdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb249ISFtLHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb249ISFRLHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydD0hIUgsdGhpcy5pZ25vcmVGZXRjaEFib3J0PSEhaXQsdGhpcy5tYXhFbnRyeVNpemUhPT0wKXtpZihjKHRoaXMsT3QpIT09MCYmIXRlKGModGhpcyxPdCkpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7aWYoIXRlKHRoaXMubWF4RW50cnlTaXplKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtYXhFbnRyeVNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkIik7Qyh0aGlzLHBuLFZpKS5jYWxsKHRoaXMpfWlmKHRoaXMuYWxsb3dTdGFsZT0hIWEsdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQ9ISFHLHRoaXMudXBkYXRlQWdlT25HZXQ9ISFzLHRoaXMudXBkYXRlQWdlT25IYXM9ISFoLHRoaXMudHRsUmVzb2x1dGlvbj10ZShpKXx8aT09PTA/aToxLHRoaXMudHRsQXV0b3B1cmdlPSEhbyx0aGlzLnR0bD1yfHwwLHRoaXMudHRsKXtpZighdGUodGhpcy50dGwpKXRocm93IG5ldyBUeXBlRXJyb3IoInR0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQiKTtDKHRoaXMsa2UsaHIpLmNhbGwodGhpcyl9aWYoYyh0aGlzLEN0KT09PTAmJnRoaXMudHRsPT09MCYmYyh0aGlzLE90KT09PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkIik7aWYoIXRoaXMudHRsQXV0b3B1cmdlJiYhYyh0aGlzLEN0KSYmIWModGhpcyxPdCkpe2NvbnN0IEF0PSJMUlVfQ0FDSEVfVU5CT1VOREVEIjtvbChBdCkmJihQaS5hZGQoQXQpLHZpKCJUVEwgY2FjaGluZyB3aXRob3V0IHR0bEF1dG9wdXJnZSwgbWF4LCBvciBtYXhTaXplIGNhbiByZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4iLCJVbmJvdW5kZWRDYWNoZVdhcm5pbmciLEF0LG9yKSl9fXN0YXRpYyB1bnNhZmVFeHBvc2VJbnRlcm5hbHMoZSl7cmV0dXJue3N0YXJ0czpjKGUsdnQpLHR0bHM6YyhlLFJ0KSxzaXplczpjKGUsUHQpLGtleU1hcDpjKGUsYXQpLGtleUxpc3Q6YyhlLGV0KSx2YWxMaXN0OmMoZSx2KSxuZXh0OmMoZSxfdCkscHJldjpjKGUsVHQpLGdldCBoZWFkKCl7cmV0dXJuIGMoZSxFdCl9LGdldCB0YWlsKCl7cmV0dXJuIGMoZSxmdCl9LGZyZWU6YyhlLEx0KSxpc0JhY2tncm91bmRGZXRjaDpuPT57dmFyIHI7cmV0dXJuIEMocj1lLFksbnQpLmNhbGwocixuKX0sYmFja2dyb3VuZEZldGNoOihuLHIsaSxvKT0+e3ZhciBzO3JldHVybiBDKHM9ZSxQZSxUbikuY2FsbChzLG4scixpLG8pfSxtb3ZlVG9UYWlsOm49Pnt2YXIgcjtyZXR1cm4gQyhyPWUsZGUscWUpLmNhbGwocixuKX0saW5kZXhlczpuPT57dmFyIHI7cmV0dXJuIEMocj1lLCR0LG5lKS5jYWxsKHIsbil9LHJpbmRleGVzOm49Pnt2YXIgcjtyZXR1cm4gQyhyPWUsa3QscmUpLmNhbGwocixuKX0saXNTdGFsZTpuPT57dmFyIHI7cmV0dXJuIGMocj1lLGJ0KS5jYWxsKHIsbil9fX1nZXQgbWF4KCl7cmV0dXJuIGModGhpcyxDdCl9Z2V0IG1heFNpemUoKXtyZXR1cm4gYyh0aGlzLE90KX1nZXQgY2FsY3VsYXRlZFNpemUoKXtyZXR1cm4gYyh0aGlzLEZ0KX1nZXQgc2l6ZSgpe3JldHVybiBjKHRoaXMsaHQpfWdldCBmZXRjaE1ldGhvZCgpe3JldHVybiBjKHRoaXMsTWUpfWdldCBkaXNwb3NlKCl7cmV0dXJuIGModGhpcyxOdCl9Z2V0IGRpc3Bvc2VBZnRlcigpe3JldHVybiBjKHRoaXMsTXQpfWdldFJlbWFpbmluZ1RUTChlKXtyZXR1cm4gYyh0aGlzLGF0KS5oYXMoZSk/MS8wOjB9KmVudHJpZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsJHQsbmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiZjKHRoaXMsZXQpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGRbYyh0aGlzLGV0KVtlXSxjKHRoaXMsdilbZV1dKX0qcmVudHJpZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsa3QscmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiZjKHRoaXMsZXQpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGRbYyh0aGlzLGV0KVtlXSxjKHRoaXMsdilbZV1dKX0qa2V5cygpe2Zvcihjb25zdCBlIG9mIEModGhpcywkdCxuZSkuY2FsbCh0aGlzKSl7Y29uc3Qgbj1jKHRoaXMsZXQpW2VdO24hPT12b2lkIDAmJiFDKHRoaXMsWSxudCkuY2FsbCh0aGlzLGModGhpcyx2KVtlXSkmJih5aWVsZCBuKX19KnJrZXlzKCl7Zm9yKGNvbnN0IGUgb2YgQyh0aGlzLGt0LHJlKS5jYWxsKHRoaXMpKXtjb25zdCBuPWModGhpcyxldClbZV07biE9PXZvaWQgMCYmIUModGhpcyxZLG50KS5jYWxsKHRoaXMsYyh0aGlzLHYpW2VdKSYmKHlpZWxkIG4pfX0qdmFsdWVzKCl7Zm9yKGNvbnN0IGUgb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMpKWModGhpcyx2KVtlXSE9PXZvaWQgMCYmIUModGhpcyxZLG50KS5jYWxsKHRoaXMsYyh0aGlzLHYpW2VdKSYmKHlpZWxkIGModGhpcyx2KVtlXSl9KnJ2YWx1ZXMoKXtmb3IoY29uc3QgZSBvZiBDKHRoaXMsa3QscmUpLmNhbGwodGhpcykpYyh0aGlzLHYpW2VdIT09dm9pZCAwJiYhQyh0aGlzLFksbnQpLmNhbGwodGhpcyxjKHRoaXMsdilbZV0pJiYoeWllbGQgYyh0aGlzLHYpW2VdKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX1maW5kKGUsbj17fSl7Zm9yKGNvbnN0IHIgb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyx2KVtyXSxvPUModGhpcyxZLG50KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO2lmKG8hPT12b2lkIDAmJmUobyxjKHRoaXMsZXQpW3JdLHRoaXMpKXJldHVybiB0aGlzLmdldChjKHRoaXMsZXQpW3JdLG4pfX1mb3JFYWNoKGUsbj10aGlzKXtmb3IoY29uc3QgciBvZiBDKHRoaXMsJHQsbmUpLmNhbGwodGhpcykpe2NvbnN0IGk9Yyh0aGlzLHYpW3JdLG89Qyh0aGlzLFksbnQpLmNhbGwodGhpcyxpKT9pLl9fc3RhbGVXaGlsZUZldGNoaW5nOmk7byE9PXZvaWQgMCYmZS5jYWxsKG4sbyxjKHRoaXMsZXQpW3JdLHRoaXMpfX1yZm9yRWFjaChlLG49dGhpcyl7Zm9yKGNvbnN0IHIgb2YgQyh0aGlzLGt0LHJlKS5jYWxsKHRoaXMpKXtjb25zdCBpPWModGhpcyx2KVtyXSxvPUModGhpcyxZLG50KS5jYWxsKHRoaXMsaSk/aS5fX3N0YWxlV2hpbGVGZXRjaGluZzppO28hPT12b2lkIDAmJmUuY2FsbChuLG8sYyh0aGlzLGV0KVtyXSx0aGlzKX19cHVyZ2VTdGFsZSgpe2xldCBlPSExO2Zvcihjb25zdCBuIG9mIEModGhpcyxrdCxyZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbikmJih0aGlzLmRlbGV0ZShjKHRoaXMsZXQpW25dKSxlPSEwKTtyZXR1cm4gZX1pbmZvKGUpe2NvbnN0IG49Yyh0aGlzLGF0KS5nZXQoZSk7aWYobj09PXZvaWQgMClyZXR1cm47Y29uc3Qgcj1jKHRoaXMsdilbbl0saT1DKHRoaXMsWSxudCkuY2FsbCh0aGlzLHIpP3IuX19zdGFsZVdoaWxlRmV0Y2hpbmc6cjtpZihpPT09dm9pZCAwKXJldHVybjtjb25zdCBvPXt2YWx1ZTppfTtpZihjKHRoaXMsUnQpJiZjKHRoaXMsdnQpKXtjb25zdCBzPWModGhpcyxSdClbbl0saD1jKHRoaXMsdnQpW25dO2lmKHMmJmgpe2NvbnN0IGE9cy0oSWUubm93KCktaCk7by50dGw9YSxvLnN0YXJ0PURhdGUubm93KCl9fXJldHVybiBjKHRoaXMsUHQpJiYoby5zaXplPWModGhpcyxQdClbbl0pLG99ZHVtcCgpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gb2YgQyh0aGlzLCR0LG5lKS5jYWxsKHRoaXMse2FsbG93U3RhbGU6ITB9KSl7Y29uc3Qgcj1jKHRoaXMsZXQpW25dLGk9Yyh0aGlzLHYpW25dLG89Qyh0aGlzLFksbnQpLmNhbGwodGhpcyxpKT9pLl9fc3RhbGVXaGlsZUZldGNoaW5nOmk7aWYobz09PXZvaWQgMHx8cj09PXZvaWQgMCljb250aW51ZTtjb25zdCBzPXt2YWx1ZTpvfTtpZihjKHRoaXMsUnQpJiZjKHRoaXMsdnQpKXtzLnR0bD1jKHRoaXMsUnQpW25dO2NvbnN0IGg9SWUubm93KCktYyh0aGlzLHZ0KVtuXTtzLnN0YXJ0PU1hdGguZmxvb3IoRGF0ZS5ub3coKS1oKX1jKHRoaXMsUHQpJiYocy5zaXplPWModGhpcyxQdClbbl0pLGUudW5zaGlmdChbcixzXSl9cmV0dXJuIGV9bG9hZChlKXt0aGlzLmNsZWFyKCk7Zm9yKGNvbnN0W24scl1vZiBlKXtpZihyLnN0YXJ0KXtjb25zdCBpPURhdGUubm93KCktci5zdGFydDtyLnN0YXJ0PUllLm5vdygpLWl9dGhpcy5zZXQobixyLnZhbHVlLHIpfX1zZXQoZSxuLHI9e30pe3ZhciBTLE8sdyxiLE07aWYobj09PXZvaWQgMClyZXR1cm4gdGhpcy5kZWxldGUoZSksdGhpcztjb25zdHt0dGw6aT10aGlzLnR0bCxzdGFydDpvLG5vRGlzcG9zZU9uU2V0OnM9dGhpcy5ub0Rpc3Bvc2VPblNldCxzaXplQ2FsY3VsYXRpb246aD10aGlzLnNpemVDYWxjdWxhdGlvbixzdGF0dXM6YX09cjtsZXR7bm9VcGRhdGVUVEw6Zj10aGlzLm5vVXBkYXRlVFRMfT1yO2NvbnN0IGQ9Yyh0aGlzLFhlKS5jYWxsKHRoaXMsZSxuLHIuc2l6ZXx8MCxoKTtpZih0aGlzLm1heEVudHJ5U2l6ZSYmZD50aGlzLm1heEVudHJ5U2l6ZSlyZXR1cm4gYSYmKGEuc2V0PSJtaXNzIixhLm1heEVudHJ5U2l6ZUV4Y2VlZGVkPSEwKSx0aGlzLmRlbGV0ZShlKSx0aGlzO2xldCBfPWModGhpcyxodCk9PT0wP3ZvaWQgMDpjKHRoaXMsYXQpLmdldChlKTtpZihfPT09dm9pZCAwKV89Yyh0aGlzLGh0KT09PTA/Yyh0aGlzLGZ0KTpjKHRoaXMsTHQpLmxlbmd0aCE9PTA/Yyh0aGlzLEx0KS5wb3AoKTpjKHRoaXMsaHQpPT09Yyh0aGlzLEN0KT9DKHRoaXMsTGUsT24pLmNhbGwodGhpcywhMSk6Yyh0aGlzLGh0KSxjKHRoaXMsZXQpW19dPWUsYyh0aGlzLHYpW19dPW4sYyh0aGlzLGF0KS5zZXQoZSxfKSxjKHRoaXMsX3QpW2ModGhpcyxmdCldPV8sYyh0aGlzLFR0KVtfXT1jKHRoaXMsZnQpLFAodGhpcyxmdCxfKSx4bih0aGlzLGh0KS5fKyssYyh0aGlzLEZlKS5jYWxsKHRoaXMsXyxkLGEpLGEmJihhLnNldD0iYWRkIiksZj0hMTtlbHNle0ModGhpcyxkZSxxZSkuY2FsbCh0aGlzLF8pO2NvbnN0IG09Yyh0aGlzLHYpW19dO2lmKG4hPT1tKXtpZihjKHRoaXMsZWUpJiZDKHRoaXMsWSxudCkuY2FsbCh0aGlzLG0pKXttLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigicmVwbGFjZWQiKSk7Y29uc3R7X19zdGFsZVdoaWxlRmV0Y2hpbmc6R309bTtHIT09dm9pZCAwJiYhcyYmKGModGhpcyxEdCkmJigoUz1jKHRoaXMsTnQpKT09bnVsbHx8Uy5jYWxsKHRoaXMsRyxlLCJzZXQiKSksYyh0aGlzLHB0KSYmKChPPWModGhpcyxsdCkpPT1udWxsfHxPLnB1c2goW0csZSwic2V0Il0pKSl9ZWxzZSBzfHwoYyh0aGlzLER0KSYmKCh3PWModGhpcyxOdCkpPT1udWxsfHx3LmNhbGwodGhpcyxtLGUsInNldCIpKSxjKHRoaXMscHQpJiYoKGI9Yyh0aGlzLGx0KSk9PW51bGx8fGIucHVzaChbbSxlLCJzZXQiXSkpKTtpZihjKHRoaXMsbGUpLmNhbGwodGhpcyxfKSxjKHRoaXMsRmUpLmNhbGwodGhpcyxfLGQsYSksYyh0aGlzLHYpW19dPW4sYSl7YS5zZXQ9InJlcGxhY2UiO2NvbnN0IEc9bSYmQyh0aGlzLFksbnQpLmNhbGwodGhpcyxtKT9tLl9fc3RhbGVXaGlsZUZldGNoaW5nOm07RyE9PXZvaWQgMCYmKGEub2xkVmFsdWU9Ryl9fWVsc2UgYSYmKGEuc2V0PSJ1cGRhdGUiKX1pZihpIT09MCYmIWModGhpcyxSdCkmJkModGhpcyxrZSxocikuY2FsbCh0aGlzKSxjKHRoaXMsUnQpJiYoZnx8Yyh0aGlzLFZlKS5jYWxsKHRoaXMsXyxpLG8pLGEmJmModGhpcyxxdCkuY2FsbCh0aGlzLGEsXykpLCFzJiZjKHRoaXMscHQpJiZjKHRoaXMsbHQpKXtjb25zdCBtPWModGhpcyxsdCk7bGV0IEc7Zm9yKDtHPW09PW51bGw/dm9pZCAwOm0uc2hpZnQoKTspKE09Yyh0aGlzLE10KSk9PW51bGx8fE0uY2FsbCh0aGlzLC4uLkcpfXJldHVybiB0aGlzfXBvcCgpe3ZhciBlO3RyeXtmb3IoO2ModGhpcyxodCk7KXtjb25zdCBuPWModGhpcyx2KVtjKHRoaXMsRXQpXTtpZihDKHRoaXMsTGUsT24pLmNhbGwodGhpcywhMCksQyh0aGlzLFksbnQpLmNhbGwodGhpcyxuKSl7aWYobi5fX3N0YWxlV2hpbGVGZXRjaGluZylyZXR1cm4gbi5fX3N0YWxlV2hpbGVGZXRjaGluZ31lbHNlIGlmKG4hPT12b2lkIDApcmV0dXJuIG59fWZpbmFsbHl7aWYoYyh0aGlzLHB0KSYmYyh0aGlzLGx0KSl7Y29uc3Qgbj1jKHRoaXMsbHQpO2xldCByO2Zvcig7cj1uPT1udWxsP3ZvaWQgMDpuLnNoaWZ0KCk7KShlPWModGhpcyxNdCkpPT1udWxsfHxlLmNhbGwodGhpcywuLi5yKX19fWhhcyhlLG49e30pe2NvbnN0e3VwZGF0ZUFnZU9uSGFzOnI9dGhpcy51cGRhdGVBZ2VPbkhhcyxzdGF0dXM6aX09bixvPWModGhpcyxhdCkuZ2V0KGUpO2lmKG8hPT12b2lkIDApe2NvbnN0IHM9Yyh0aGlzLHYpW29dO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMscykmJnMuX19zdGFsZVdoaWxlRmV0Y2hpbmc9PT12b2lkIDApcmV0dXJuITE7aWYoYyh0aGlzLGJ0KS5jYWxsKHRoaXMsbykpaSYmKGkuaGFzPSJzdGFsZSIsYyh0aGlzLHF0KS5jYWxsKHRoaXMsaSxvKSk7ZWxzZSByZXR1cm4gciYmYyh0aGlzLGZlKS5jYWxsKHRoaXMsbyksaSYmKGkuaGFzPSJoaXQiLGModGhpcyxxdCkuY2FsbCh0aGlzLGksbykpLCEwfWVsc2UgaSYmKGkuaGFzPSJtaXNzIik7cmV0dXJuITF9cGVlayhlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGV9PW4saT1jKHRoaXMsYXQpLmdldChlKTtpZihpPT09dm9pZCAwfHwhciYmYyh0aGlzLGJ0KS5jYWxsKHRoaXMsaSkpcmV0dXJuO2NvbnN0IG89Yyh0aGlzLHYpW2ldO3JldHVybiBDKHRoaXMsWSxudCkuY2FsbCh0aGlzLG8pP28uX19zdGFsZVdoaWxlRmV0Y2hpbmc6b31hc3luYyBmZXRjaChlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGUsdXBkYXRlQWdlT25HZXQ6aT10aGlzLnVwZGF0ZUFnZU9uR2V0LG5vRGVsZXRlT25TdGFsZUdldDpvPXRoaXMubm9EZWxldGVPblN0YWxlR2V0LHR0bDpzPXRoaXMudHRsLG5vRGlzcG9zZU9uU2V0Omg9dGhpcy5ub0Rpc3Bvc2VPblNldCxzaXplOmE9MCxzaXplQ2FsY3VsYXRpb246Zj10aGlzLnNpemVDYWxjdWxhdGlvbixub1VwZGF0ZVRUTDpkPXRoaXMubm9VcGRhdGVUVEwsbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOl89dGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246Uz10aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLGlnbm9yZUZldGNoQWJvcnQ6Tz10aGlzLmlnbm9yZUZldGNoQWJvcnQsYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDp3PXRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxjb250ZXh0OmIsZm9yY2VSZWZyZXNoOk09ITEsc3RhdHVzOm0sc2lnbmFsOkd9PW47aWYoIWModGhpcyxlZSkpcmV0dXJuIG0mJihtLmZldGNoPSJnZXQiKSx0aGlzLmdldChlLHthbGxvd1N0YWxlOnIsdXBkYXRlQWdlT25HZXQ6aSxub0RlbGV0ZU9uU3RhbGVHZXQ6byxzdGF0dXM6bX0pO2NvbnN0IFE9e2FsbG93U3RhbGU6cix1cGRhdGVBZ2VPbkdldDppLG5vRGVsZXRlT25TdGFsZUdldDpvLHR0bDpzLG5vRGlzcG9zZU9uU2V0Omgsc2l6ZTphLHNpemVDYWxjdWxhdGlvbjpmLG5vVXBkYXRlVFRMOmQsbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uOl8sYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb246UyxhbGxvd1N0YWxlT25GZXRjaEFib3J0OncsaWdub3JlRmV0Y2hBYm9ydDpPLHN0YXR1czptLHNpZ25hbDpHfTtsZXQgSD1jKHRoaXMsYXQpLmdldChlKTtpZihIPT09dm9pZCAwKXttJiYobS5mZXRjaD0ibWlzcyIpO2NvbnN0IGl0PUModGhpcyxQZSxUbikuY2FsbCh0aGlzLGUsSCxRLGIpO3JldHVybiBpdC5fX3JldHVybmVkPWl0fWVsc2V7Y29uc3QgaXQ9Yyh0aGlzLHYpW0hdO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMsaXQpKXtjb25zdCBVPXImJml0Ll9fc3RhbGVXaGlsZUZldGNoaW5nIT09dm9pZCAwO3JldHVybiBtJiYobS5mZXRjaD0iaW5mbGlnaHQiLFUmJihtLnJldHVybmVkU3RhbGU9ITApKSxVP2l0Ll9fc3RhbGVXaGlsZUZldGNoaW5nOml0Ll9fcmV0dXJuZWQ9aXR9Y29uc3QgeXQ9Yyh0aGlzLGJ0KS5jYWxsKHRoaXMsSCk7aWYoIU0mJiF5dClyZXR1cm4gbSYmKG0uZmV0Y2g9ImhpdCIpLEModGhpcyxkZSxxZSkuY2FsbCh0aGlzLEgpLGkmJmModGhpcyxmZSkuY2FsbCh0aGlzLEgpLG0mJmModGhpcyxxdCkuY2FsbCh0aGlzLG0sSCksaXQ7Y29uc3QgQXQ9Qyh0aGlzLFBlLFRuKS5jYWxsKHRoaXMsZSxILFEsYiksVD1BdC5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmcjtyZXR1cm4gbSYmKG0uZmV0Y2g9eXQ/InN0YWxlIjoicmVmcmVzaCIsVCYmeXQmJihtLnJldHVybmVkU3RhbGU9ITApKSxUP0F0Ll9fc3RhbGVXaGlsZUZldGNoaW5nOkF0Ll9fcmV0dXJuZWQ9QXR9fWdldChlLG49e30pe2NvbnN0e2FsbG93U3RhbGU6cj10aGlzLmFsbG93U3RhbGUsdXBkYXRlQWdlT25HZXQ6aT10aGlzLnVwZGF0ZUFnZU9uR2V0LG5vRGVsZXRlT25TdGFsZUdldDpvPXRoaXMubm9EZWxldGVPblN0YWxlR2V0LHN0YXR1czpzfT1uLGg9Yyh0aGlzLGF0KS5nZXQoZSk7aWYoaCE9PXZvaWQgMCl7Y29uc3QgYT1jKHRoaXMsdilbaF0sZj1DKHRoaXMsWSxudCkuY2FsbCh0aGlzLGEpO3JldHVybiBzJiZjKHRoaXMscXQpLmNhbGwodGhpcyxzLGgpLGModGhpcyxidCkuY2FsbCh0aGlzLGgpPyhzJiYocy5nZXQ9InN0YWxlIiksZj8ocyYmciYmYS5fX3N0YWxlV2hpbGVGZXRjaGluZyE9PXZvaWQgMCYmKHMucmV0dXJuZWRTdGFsZT0hMCkscj9hLl9fc3RhbGVXaGlsZUZldGNoaW5nOnZvaWQgMCk6KG98fHRoaXMuZGVsZXRlKGUpLHMmJnImJihzLnJldHVybmVkU3RhbGU9ITApLHI/YTp2b2lkIDApKToocyYmKHMuZ2V0PSJoaXQiKSxmP2EuX19zdGFsZVdoaWxlRmV0Y2hpbmc6KEModGhpcyxkZSxxZSkuY2FsbCh0aGlzLGgpLGkmJmModGhpcyxmZSkuY2FsbCh0aGlzLGgpLGEpKX1lbHNlIHMmJihzLmdldD0ibWlzcyIpfWRlbGV0ZShlKXt2YXIgcixpLG8scztsZXQgbj0hMTtpZihjKHRoaXMsaHQpIT09MCl7Y29uc3QgaD1jKHRoaXMsYXQpLmdldChlKTtpZihoIT09dm9pZCAwKWlmKG49ITAsYyh0aGlzLGh0KT09PTEpdGhpcy5jbGVhcigpO2Vsc2V7Yyh0aGlzLGxlKS5jYWxsKHRoaXMsaCk7Y29uc3QgYT1jKHRoaXMsdilbaF07aWYoQyh0aGlzLFksbnQpLmNhbGwodGhpcyxhKT9hLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigiZGVsZXRlZCIpKTooYyh0aGlzLER0KXx8Yyh0aGlzLHB0KSkmJihjKHRoaXMsRHQpJiYoKHI9Yyh0aGlzLE50KSk9PW51bGx8fHIuY2FsbCh0aGlzLGEsZSwiZGVsZXRlIikpLGModGhpcyxwdCkmJigoaT1jKHRoaXMsbHQpKT09bnVsbHx8aS5wdXNoKFthLGUsImRlbGV0ZSJdKSkpLGModGhpcyxhdCkuZGVsZXRlKGUpLGModGhpcyxldClbaF09dm9pZCAwLGModGhpcyx2KVtoXT12b2lkIDAsaD09PWModGhpcyxmdCkpUCh0aGlzLGZ0LGModGhpcyxUdClbaF0pO2Vsc2UgaWYoaD09PWModGhpcyxFdCkpUCh0aGlzLEV0LGModGhpcyxfdClbaF0pO2Vsc2V7Y29uc3QgZj1jKHRoaXMsVHQpW2hdO2ModGhpcyxfdClbZl09Yyh0aGlzLF90KVtoXTtjb25zdCBkPWModGhpcyxfdClbaF07Yyh0aGlzLFR0KVtkXT1jKHRoaXMsVHQpW2hdfXhuKHRoaXMsaHQpLl8tLSxjKHRoaXMsTHQpLnB1c2goaCl9fWlmKGModGhpcyxwdCkmJigobz1jKHRoaXMsbHQpKSE9bnVsbCYmby5sZW5ndGgpKXtjb25zdCBoPWModGhpcyxsdCk7bGV0IGE7Zm9yKDthPWg9PW51bGw/dm9pZCAwOmguc2hpZnQoKTspKHM9Yyh0aGlzLE10KSk9PW51bGx8fHMuY2FsbCh0aGlzLC4uLmEpfXJldHVybiBufWNsZWFyKCl7dmFyIGUsbixyO2Zvcihjb25zdCBpIG9mIEModGhpcyxrdCxyZSkuY2FsbCh0aGlzLHthbGxvd1N0YWxlOiEwfSkpe2NvbnN0IG89Yyh0aGlzLHYpW2ldO2lmKEModGhpcyxZLG50KS5jYWxsKHRoaXMsbykpby5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoImRlbGV0ZWQiKSk7ZWxzZXtjb25zdCBzPWModGhpcyxldClbaV07Yyh0aGlzLER0KSYmKChlPWModGhpcyxOdCkpPT1udWxsfHxlLmNhbGwodGhpcyxvLHMsImRlbGV0ZSIpKSxjKHRoaXMscHQpJiYoKG49Yyh0aGlzLGx0KSk9PW51bGx8fG4ucHVzaChbbyxzLCJkZWxldGUiXSkpfX1pZihjKHRoaXMsYXQpLmNsZWFyKCksYyh0aGlzLHYpLmZpbGwodm9pZCAwKSxjKHRoaXMsZXQpLmZpbGwodm9pZCAwKSxjKHRoaXMsUnQpJiZjKHRoaXMsdnQpJiYoYyh0aGlzLFJ0KS5maWxsKDApLGModGhpcyx2dCkuZmlsbCgwKSksYyh0aGlzLFB0KSYmYyh0aGlzLFB0KS5maWxsKDApLFAodGhpcyxFdCwwKSxQKHRoaXMsZnQsMCksYyh0aGlzLEx0KS5sZW5ndGg9MCxQKHRoaXMsRnQsMCksUCh0aGlzLGh0LDApLGModGhpcyxwdCkmJmModGhpcyxsdCkpe2NvbnN0IGk9Yyh0aGlzLGx0KTtsZXQgbztmb3IoO289aT09bnVsbD92b2lkIDA6aS5zaGlmdCgpOykocj1jKHRoaXMsTXQpKT09bnVsbHx8ci5jYWxsKHRoaXMsLi4ubyl9fX07bGV0IGlyPW9yO1RsPVN5bWJvbC50b1N0cmluZ1RhZyxDdD1uZXcgV2Vha01hcCxPdD1uZXcgV2Vha01hcCxOdD1uZXcgV2Vha01hcCxNdD1uZXcgV2Vha01hcCxNZT1uZXcgV2Vha01hcCxodD1uZXcgV2Vha01hcCxGdD1uZXcgV2Vha01hcCxhdD1uZXcgV2Vha01hcCxldD1uZXcgV2Vha01hcCx2PW5ldyBXZWFrTWFwLF90PW5ldyBXZWFrTWFwLFR0PW5ldyBXZWFrTWFwLEV0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLEx0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLFB0PW5ldyBXZWFrTWFwLHZ0PW5ldyBXZWFrTWFwLFJ0PW5ldyBXZWFrTWFwLER0PW5ldyBXZWFrTWFwLGVlPW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGtlPW5ldyBXZWFrU2V0LGhyPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgRW4oYyh0aGlzLEN0KSksbj1uZXcgRW4oYyh0aGlzLEN0KSk7UCh0aGlzLFJ0LGUpLFAodGhpcyx2dCxuKSxQKHRoaXMsVmUsKG8scyxoPUllLm5vdygpKT0+e2lmKG5bb109cyE9PTA/aDowLGVbb109cyxzIT09MCYmdGhpcy50dGxBdXRvcHVyZ2Upe2NvbnN0IGE9c2V0VGltZW91dCgoKT0+e2ModGhpcyxidCkuY2FsbCh0aGlzLG8pJiZ0aGlzLmRlbGV0ZShjKHRoaXMsZXQpW29dKX0scysxKTthLnVucmVmJiZhLnVucmVmKCl9fSksUCh0aGlzLGZlLG89PntuW29dPWVbb10hPT0wP0llLm5vdygpOjB9KSxQKHRoaXMscXQsKG8scyk9PntpZihlW3NdKXtjb25zdCBoPWVbc10sYT1uW3NdO2lmKCFofHwhYSlyZXR1cm47by50dGw9aCxvLnN0YXJ0PWEsby5ub3c9cnx8aSgpO2NvbnN0IGY9by5ub3ctYTtvLnJlbWFpbmluZ1RUTD1oLWZ9fSk7bGV0IHI9MDtjb25zdCBpPSgpPT57Y29uc3Qgbz1JZS5ub3coKTtpZih0aGlzLnR0bFJlc29sdXRpb24+MCl7cj1vO2NvbnN0IHM9c2V0VGltZW91dCgoKT0+cj0wLHRoaXMudHRsUmVzb2x1dGlvbik7cy51bnJlZiYmcy51bnJlZigpfXJldHVybiBvfTt0aGlzLmdldFJlbWFpbmluZ1RUTD1vPT57Y29uc3Qgcz1jKHRoaXMsYXQpLmdldChvKTtpZihzPT09dm9pZCAwKXJldHVybiAwO2NvbnN0IGg9ZVtzXSxhPW5bc107aWYoIWh8fCFhKXJldHVybiAxLzA7Y29uc3QgZj0ocnx8aSgpKS1hO3JldHVybiBoLWZ9LFAodGhpcyxidCxvPT57Y29uc3Qgcz1uW29dLGg9ZVtvXTtyZXR1cm4hIWgmJiEhcyYmKHJ8fGkoKSktcz5ofSl9LGZlPW5ldyBXZWFrTWFwLHF0PW5ldyBXZWFrTWFwLFZlPW5ldyBXZWFrTWFwLGJ0PW5ldyBXZWFrTWFwLHBuPW5ldyBXZWFrU2V0LFZpPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgRW4oYyh0aGlzLEN0KSk7UCh0aGlzLEZ0LDApLFAodGhpcyxQdCxlKSxQKHRoaXMsbGUsbj0+e1AodGhpcyxGdCxjKHRoaXMsRnQpLWVbbl0pLGVbbl09MH0pLFAodGhpcyxYZSwobixyLGksbyk9PntpZihDKHRoaXMsWSxudCkuY2FsbCh0aGlzLHIpKXJldHVybiAwO2lmKCF0ZShpKSlpZihvKXtpZih0eXBlb2YgbyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoaT1vKHIsbiksIXRlKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoInNpemVDYWxjdWxhdGlvbiByZXR1cm4gaW52YWxpZCAoZXhwZWN0IHBvc2l0aXZlIGludGVnZXIpIil9ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuIFdoZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uIG9yIHNpemUgbXVzdCBiZSBzZXQuIik7cmV0dXJuIGl9KSxQKHRoaXMsRmUsKG4scixpKT0+e2lmKGVbbl09cixjKHRoaXMsT3QpKXtjb25zdCBvPWModGhpcyxPdCktZVtuXTtmb3IoO2ModGhpcyxGdCk+bzspQyh0aGlzLExlLE9uKS5jYWxsKHRoaXMsITApfVAodGhpcyxGdCxjKHRoaXMsRnQpK2Vbbl0pLGkmJihpLmVudHJ5U2l6ZT1yLGkudG90YWxDYWxjdWxhdGVkU2l6ZT1jKHRoaXMsRnQpKX0pfSxsZT1uZXcgV2Vha01hcCxGZT1uZXcgV2Vha01hcCxYZT1uZXcgV2Vha01hcCwkdD1uZXcgV2Vha1NldCxuZT1mdW5jdGlvbiooe2FsbG93U3RhbGU6ZT10aGlzLmFsbG93U3RhbGV9PXt9KXtpZihjKHRoaXMsaHQpKWZvcihsZXQgbj1jKHRoaXMsZnQpOyEoIUModGhpcyxXZSxjcikuY2FsbCh0aGlzLG4pfHwoKGV8fCFjKHRoaXMsYnQpLmNhbGwodGhpcyxuKSkmJih5aWVsZCBuKSxuPT09Yyh0aGlzLEV0KSkpOyluPWModGhpcyxUdClbbl19LGt0PW5ldyBXZWFrU2V0LHJlPWZ1bmN0aW9uKih7YWxsb3dTdGFsZTplPXRoaXMuYWxsb3dTdGFsZX09e30pe2lmKGModGhpcyxodCkpZm9yKGxldCBuPWModGhpcyxFdCk7ISghQyh0aGlzLFdlLGNyKS5jYWxsKHRoaXMsbil8fCgoZXx8IWModGhpcyxidCkuY2FsbCh0aGlzLG4pKSYmKHlpZWxkIG4pLG49PT1jKHRoaXMsZnQpKSk7KW49Yyh0aGlzLF90KVtuXX0sV2U9bmV3IFdlYWtTZXQsY3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJmModGhpcyxhdCkuZ2V0KGModGhpcyxldClbZV0pPT09ZX0sTGU9bmV3IFdlYWtTZXQsT249ZnVuY3Rpb24oZSl7dmFyIG8scztjb25zdCBuPWModGhpcyxFdCkscj1jKHRoaXMsZXQpW25dLGk9Yyh0aGlzLHYpW25dO3JldHVybiBjKHRoaXMsZWUpJiZDKHRoaXMsWSxudCkuY2FsbCh0aGlzLGkpP2kuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCJldmljdGVkIikpOihjKHRoaXMsRHQpfHxjKHRoaXMscHQpKSYmKGModGhpcyxEdCkmJigobz1jKHRoaXMsTnQpKT09bnVsbHx8by5jYWxsKHRoaXMsaSxyLCJldmljdCIpKSxjKHRoaXMscHQpJiYoKHM9Yyh0aGlzLGx0KSk9PW51bGx8fHMucHVzaChbaSxyLCJldmljdCJdKSkpLGModGhpcyxsZSkuY2FsbCh0aGlzLG4pLGUmJihjKHRoaXMsZXQpW25dPXZvaWQgMCxjKHRoaXMsdilbbl09dm9pZCAwLGModGhpcyxMdCkucHVzaChuKSksYyh0aGlzLGh0KT09PTE/KFAodGhpcyxFdCxQKHRoaXMsZnQsMCkpLGModGhpcyxMdCkubGVuZ3RoPTApOlAodGhpcyxFdCxjKHRoaXMsX3QpW25dKSxjKHRoaXMsYXQpLmRlbGV0ZShyKSx4bih0aGlzLGh0KS5fLS0sbn0sUGU9bmV3IFdlYWtTZXQsVG49ZnVuY3Rpb24oZSxuLHIsaSl7Y29uc3Qgbz1uPT09dm9pZCAwP3ZvaWQgMDpjKHRoaXMsdilbbl07aWYoQyh0aGlzLFksbnQpLmNhbGwodGhpcyxvKSlyZXR1cm4gbztjb25zdCBzPW5ldyBkbix7c2lnbmFsOmh9PXI7aD09bnVsbHx8aC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PnMuYWJvcnQoaC5yZWFzb24pLHtzaWduYWw6cy5zaWduYWx9KTtjb25zdCBhPXtzaWduYWw6cy5zaWduYWwsb3B0aW9uczpyLGNvbnRleHQ6aX0sZj0oYixNPSExKT0+e2NvbnN0e2Fib3J0ZWQ6bX09cy5zaWduYWwsRz1yLmlnbm9yZUZldGNoQWJvcnQmJmIhPT12b2lkIDA7aWYoci5zdGF0dXMmJihtJiYhTT8oci5zdGF0dXMuZmV0Y2hBYm9ydGVkPSEwLHIuc3RhdHVzLmZldGNoRXJyb3I9cy5zaWduYWwucmVhc29uLEcmJihyLnN0YXR1cy5mZXRjaEFib3J0SWdub3JlZD0hMCkpOnIuc3RhdHVzLmZldGNoUmVzb2x2ZWQ9ITApLG0mJiFHJiYhTSlyZXR1cm4gXyhzLnNpZ25hbC5yZWFzb24pO2NvbnN0IFE9TztyZXR1cm4gYyh0aGlzLHYpW25dPT09TyYmKGI9PT12b2lkIDA/US5fX3N0YWxlV2hpbGVGZXRjaGluZz9jKHRoaXMsdilbbl09US5fX3N0YWxlV2hpbGVGZXRjaGluZzp0aGlzLmRlbGV0ZShlKTooci5zdGF0dXMmJihyLnN0YXR1cy5mZXRjaFVwZGF0ZWQ9ITApLHRoaXMuc2V0KGUsYixhLm9wdGlvbnMpKSksYn0sZD1iPT4oci5zdGF0dXMmJihyLnN0YXR1cy5mZXRjaFJlamVjdGVkPSEwLHIuc3RhdHVzLmZldGNoRXJyb3I9YiksXyhiKSksXz1iPT57Y29uc3R7YWJvcnRlZDpNfT1zLnNpZ25hbCxtPU0mJnIuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxHPW18fHIuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sUT1HfHxyLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixIPU87aWYoYyh0aGlzLHYpW25dPT09TyYmKCFRfHxILl9fc3RhbGVXaGlsZUZldGNoaW5nPT09dm9pZCAwP3RoaXMuZGVsZXRlKGUpOm18fChjKHRoaXMsdilbbl09SC5fX3N0YWxlV2hpbGVGZXRjaGluZykpLEcpcmV0dXJuIHIuc3RhdHVzJiZILl9fc3RhbGVXaGlsZUZldGNoaW5nIT09dm9pZCAwJiYoci5zdGF0dXMucmV0dXJuZWRTdGFsZT0hMCksSC5fX3N0YWxlV2hpbGVGZXRjaGluZztpZihILl9fcmV0dXJuZWQ9PT1IKXRocm93IGJ9LFM9KGIsTSk9Pnt2YXIgRztjb25zdCBtPShHPWModGhpcyxNZSkpPT1udWxsP3ZvaWQgMDpHLmNhbGwodGhpcyxlLG8sYSk7bSYmbSBpbnN0YW5jZW9mIFByb21pc2UmJm0udGhlbihRPT5iKFE9PT12b2lkIDA/dm9pZCAwOlEpLE0pLHMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoKT0+eyghci5pZ25vcmVGZXRjaEFib3J0fHxyLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpJiYoYih2b2lkIDApLHIuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCYmKGI9UT0+ZihRLCEwKSkpfSl9O3Iuc3RhdHVzJiYoci5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkPSEwKTtjb25zdCBPPW5ldyBQcm9taXNlKFMpLnRoZW4oZixkKSx3PU9iamVjdC5hc3NpZ24oTyx7X19hYm9ydENvbnRyb2xsZXI6cyxfX3N0YWxlV2hpbGVGZXRjaGluZzpvLF9fcmV0dXJuZWQ6dm9pZCAwfSk7cmV0dXJuIG49PT12b2lkIDA/KHRoaXMuc2V0KGUsdyx7Li4uYS5vcHRpb25zLHN0YXR1czp2b2lkIDB9KSxuPWModGhpcyxhdCkuZ2V0KGUpKTpjKHRoaXMsdilbbl09dyx3fSxZPW5ldyBXZWFrU2V0LG50PWZ1bmN0aW9uKGUpe2lmKCFjKHRoaXMsZWUpKXJldHVybiExO2NvbnN0IG49ZTtyZXR1cm4hIW4mJm4gaW5zdGFuY2VvZiBQcm9taXNlJiZuLmhhc093blByb3BlcnR5KCJfX3N0YWxlV2hpbGVGZXRjaGluZyIpJiZuLl9fYWJvcnRDb250cm9sbGVyIGluc3RhbmNlb2YgZG59LHplPW5ldyBXZWFrU2V0LHVyPWZ1bmN0aW9uKGUsbil7Yyh0aGlzLFR0KVtuXT1lLGModGhpcyxfdClbZV09bn0sZGU9bmV3IFdlYWtTZXQscWU9ZnVuY3Rpb24oZSl7ZSE9PWModGhpcyxmdCkmJihlPT09Yyh0aGlzLEV0KT9QKHRoaXMsRXQsYyh0aGlzLF90KVtlXSk6Qyh0aGlzLHplLHVyKS5jYWxsKHRoaXMsYyh0aGlzLFR0KVtlXSxjKHRoaXMsX3QpW2VdKSxDKHRoaXMsemUsdXIpLmNhbGwodGhpcyxjKHRoaXMsZnQpLGUpLFAodGhpcyxmdCxlKSl9O2NvbnN0IFVpPW5ldyBpcih7bWF4OjFlM30pLHNsPSh0LGUsbik9Pntjb25zdCByPUpTT04uc3RyaW5naWZ5KHQucHJvcGVydGllcyksaT1VaS5nZXQocik7aWYoaSlyZXR1cm4gaTtjb25zdCBvPSgoKT0+e3N3aXRjaChYdC50eXBlc1t0LnR5cGVdKXtjYXNlIlBvbHlnb24iOnJldHVybiJwb2x5Z29uIjtjYXNlIkxpbmVTdHJpbmciOnJldHVybiJwb2x5bGluZSI7Y2FzZSJQb2ludCI6cmV0dXJuIm1hcmtlciI7ZGVmYXVsdDpyZXR1cm59fSkoKSxzPSgoKT0+e2lmKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpIT09InNpbXBsZSJ8fCFvKXJldHVybjtjb25zdCBhPWFsKCIiLHQsZSxvKTtpZihhKXJldHVybiBsbj09bnVsbD92b2lkIDA6bG4obixhKX0pKCksaD0oKCk9PntpZihvPT09InBvbHlnb24iKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMucG9seWdvbjtyZXR1cm57ZmlsbFN0eWxlOigoYT09bnVsbD92b2lkIDA6YS5maWxsKT8/ITApJiYoKGE9PW51bGw/dm9pZCAwOmEuc2hvdyk/PyEwKT9hPT1udWxsP3ZvaWQgMDphLmZpbGxDb2xvcjoicmdiYSgwLDAsMCwwKSIsc3Ryb2tlU3R5bGU6YSE9bnVsbCYmYS5zdHJva2UmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnN0cm9rZVdpZHRoLGxpbmVKb2luOmE9PW51bGw/dm9pZCAwOmEubGluZUpvaW59fWlmKG89PT0icG9seWxpbmUiKXtjb25zdCBhPXM9PW51bGw/dm9pZCAwOnMucG9seWxpbmU7cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3IpPz8hMCkmJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLHN0cm9rZVN0eWxlOmEhPW51bGwmJmEuc3Ryb2tlQ29sb3ImJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEuc3Ryb2tlQ29sb3I6InJnYmEoMCwwLDAsMCkiLGxpbmVXaWR0aDphPT1udWxsP3ZvaWQgMDphLnN0cm9rZVdpZHRofX1pZihvPT09Im1hcmtlciIpe2NvbnN0IGE9cz09bnVsbD92b2lkIDA6cy5tYXJrZXI7cmV0dXJue2ZpbGxTdHlsZTooKGE9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcik/PyEwKSYmKChhPT1udWxsP3ZvaWQgMDphLnNob3cpPz8hMCk/YT09bnVsbD92b2lkIDA6YS5wb2ludENvbG9yOiJyZ2JhKDAsMCwwLDApIixzdHJva2VTdHlsZTphIT1udWxsJiZhLnBvaW50Q29sb3ImJigoYT09bnVsbD92b2lkIDA6YS5zaG93KT8/ITApP2E9PW51bGw/dm9pZCAwOmEucG9pbnRDb2xvcjoicmdiYSgwLDAsMCwwKSIsbGluZVdpZHRoOmE9PW51bGw/dm9pZCAwOmEucG9pbnRTaXplfX19KSgpO3JldHVybiBVaS5zZXQocixoKSxofSxhbD0odCxlLG4scik9Pntjb25zdCBpPWUubG9hZEdlb21ldHJ5KCksW28sc109KCgpPT57aWYocj09PSJwb2x5Z29uIilyZXR1cm5bIlBvbHlnb24iLGkubWFwKGg9PmgubWFwKGE9PlthLngsYS55XSkpXTtpZihyPT09InBvbHlsaW5lIilyZXR1cm5bIkxpbmVTdHJpbmciLGlbMF0ubWFwKGg9PltoLngsaC55XSldO2lmKHI9PT0ibWFya2VyIilyZXR1cm5bIlBvaW50IixbaVswXVswXS54LGlbMF1bMF0ueV1dO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcHBlYXJhbmNlICR7cn1gKX0pKCk7cmV0dXJue3R5cGU6ImZlYXR1cmUiLGlkOnQsZ2VvbWV0cnk6e3R5cGU6byxjb29yZGluYXRlczpzfSxwcm9wZXJ0aWVzOmUucHJvcGVydGllcyxyYW5nZTp7eDpuLngseTpuLnksejpuLmxldmVsfX19O2Z1bmN0aW9uIGhsKHQpe3JldHVybiB1bCh0KT09PW1uLkNPVU5URVJfQ0xPQ0tXSVNFfWZ1bmN0aW9uIGppKHQsZSl7Y29uc3Qgbj10Lngscj10Lnk7bGV0IGk9ITE7Zm9yKGxldCBvPTAscz1lLmxlbmd0aC0xO288ZS5sZW5ndGg7cz1vKyspe2NvbnN0IGg9ZVtvXS54LGE9ZVtvXS55LGY9ZVtzXS54LGQ9ZVtzXS55O2E+ciE9ZD5yJiZuPChmLWgpKihyLWEpLyhkLWEpK2gmJihpPSFpKX1yZXR1cm4gaX1mdW5jdGlvbiBjbCh0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKGppKGUsdFtuXSkpe2xldCByPSExO2Zvcig7bisxPHQubGVuZ3RoJiYhaGwodFtuKzFdKTspbisrLCFyJiZqaShlLHRbbl0pJiYocj0hMCk7aWYoIXIpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gdWwodCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgbj10W2UtMV0ueCoodFswXS55LXRbZS0yXS55KSt0WzBdLngqKHRbMV0ueS10W2UtMV0ueSk7Zm9yKGxldCByPTE7cjw9ZS0yO3IrKyluKz10W3JdLngqKHRbcisxXS55LXRbci0xXS55KTtpZihpc05hTihuKSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIG4+MD9tbi5DT1VOVEVSX0NMT0NLV0lTRTptbi5DTE9DS1dJU0V9Y29uc3QgJGU9MjU2O2NsYXNzIGZse2NvbnN0cnVjdG9yKGUpe0wodGhpcywiX3VybFRlbXBsYXRlIik7TCh0aGlzLCJfcGFyc2VUaWxlIik7TCh0aGlzLCJfdGlsaW5nU2NoZW1lIik7TCh0aGlzLCJfbGF5ZXJOYW1lcyIpO0wodGhpcywiX3RpbGVXaWR0aCIpO0wodGhpcywiX3RpbGVIZWlnaHQiKTtMKHRoaXMsIl9waWNrUG9pbnRSYWRpdXMiKTtMKHRoaXMsIl9waWNrTGluZVdpZHRoIik7TCh0aGlzLCJfdGlsZUNhY2hlcyIpO3RoaXMuX3BhcnNlVGlsZT1sbCx0aGlzLl91cmxUZW1wbGF0ZT1lLnVybFRlbXBsYXRlLHRoaXMuX3RpbGVXaWR0aD0kZSx0aGlzLl90aWxlSGVpZ2h0PSRlLHRoaXMuX2xheWVyTmFtZXM9ZS5sYXllck5hbWVzLHRoaXMuX3RpbGluZ1NjaGVtZT1uZXcgS3QsdGhpcy5fcGlja1BvaW50UmFkaXVzPWUucGlja1BvaW50UmFkaXVzPz9kbCx0aGlzLl9waWNrTGluZVdpZHRoPWUucGlja0xpbmVXaWR0aD8/RWx9YXN5bmMgcmVuZGVyKGUsbixyLGkpe2NvbnN0IG89R2kodGhpcy5fdXJsVGVtcGxhdGUsbik7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGF5ZXJOYW1lcy5tYXAocz0+dGhpcy5fcmVuZGVyQ2FudmFzKG8sZSxuLHMscixpKSkpfWFzeW5jIF9yZW5kZXJDYW52YXMoZSxuLHIsaSxvLHMpe2lmKCFlKXJldHVybjtjb25zdCBoPWF3YWl0IHRoaXMuX2NhY2hlZFRpbGUoZSksZj1pLnNwbGl0KC8sICovKS5maWx0ZXIoQm9vbGVhbikubWFwKGQ9Pmg9PW51bGw/dm9pZCAwOmgubGF5ZXJzW2RdKTtmJiYobi5zdHJva2VTdHlsZT0iYmxhY2siLG4uZmlsbFN0eWxlPSJibGFjayIsbi5saW5lV2lkdGg9MSxuLm1pdGVyTGltaXQ9MixuLnNldFRyYW5zZm9ybSh0aGlzLl90aWxlV2lkdGgqby8kZSwwLDAsdGhpcy5fdGlsZUhlaWdodCpvLyRlLDAsMCksZi5mb3JFYWNoKGQ9PntpZighZClyZXR1cm47Y29uc3QgXz0kZS9kLmV4dGVudDtmb3IobGV0IFM9MDtTPGQubGVuZ3RoO1MrKyl7Y29uc3QgTz1kLmZlYXR1cmUoUyksdz1zbChPLHIscyk7aWYoIXcpY29udGludWU7bi5maWxsU3R5bGU9dy5maWxsU3R5bGU/P24uZmlsbFN0eWxlLG4uc3Ryb2tlU3R5bGU9dy5zdHJva2VTdHlsZT8/bi5zdHJva2VTdHlsZSxuLmxpbmVXaWR0aD13LmxpbmVXaWR0aD8/bi5saW5lV2lkdGgsbi5saW5lSm9pbj13LmxpbmVKb2luPz9uLmxpbmVKb2luO2NvbnN0IGI9Ty5sb2FkR2VvbWV0cnkoKTtYdC50eXBlc1tPLnR5cGVdPT09IlBvbHlnb24iP3RoaXMuX3JlbmRlclBvbHlnb24obixiLF8sKHcubGluZVdpZHRoPz8xKT4wKTpYdC50eXBlc1tPLnR5cGVdPT09IlBvaW50Ij90aGlzLl9yZW5kZXJQb2ludChuLGIsXyk6WHQudHlwZXNbTy50eXBlXT09PSJMaW5lU3RyaW5nIj90aGlzLl9yZW5kZXJMaW5lU3RyaW5nKG4sYixfKTpjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGU6ICR7Ty50eXBlfSBpbiByZWdpb24gbWFwIG9uIHRpbGUgJHtbci5sZXZlbCxyLngsci55XS5qb2luKCIvIil9YCl9fSkpfV9yZW5kZXJQb2x5Z29uKGUsbixyLGkpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspe2NvbnN0IHM9bltvXTtsZXQgaD1zWzBdO2UubW92ZVRvKGgueCpyLGgueSpyKTtmb3IobGV0IGE9MTthPHMubGVuZ3RoO2ErKyloPXNbYV0sZS5saW5lVG8oaC54KnIsaC55KnIpO2UuY2xvc2VQYXRoKCl9aSYmZS5zdHJva2UoKSxlLmZpbGwoKX1fcmVuZGVyUG9pbnQoZSxuLHIpe2UuYmVnaW5QYXRoKCk7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2NvbnN0IG89bltpXVswXSxbcyxoXT1bby54KnIsby55KnJdLGE9ZS5saW5lV2lkdGg7ZS5iZWdpblBhdGgoKSxlLmFyYyhzLGgsYSwwLDIqTWF0aC5QSSksZS5maWxsKCl9fV9yZW5kZXJMaW5lU3RyaW5nKGUsbixyKXtlLmJlZ2luUGF0aCgpO2ZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgbz1uW2ldWzBdO2UubW92ZVRvKG8ueCpyLG8ueSpyKTtmb3IobGV0IHM9MTtzPG5baV0ubGVuZ3RoO3MrKylvPW5baV1bc10sZS5saW5lVG8oby54KnIsby55KnIpfWUuc3Ryb2tlKCl9cGlja0ZlYXR1cmVzKGUsbixyLGkpe2NvbnN0IG89R2kodGhpcy5fdXJsVGVtcGxhdGUsZSk7cmV0dXJuIHRoaXMuX3BpY2tGZWF0dXJlc0Zyb21MYXllcihvLGUsbixyLGkpfWFzeW5jIF9waWNrRmVhdHVyZXNGcm9tTGF5ZXIoZSxuLHIsaSxvKXt0cnl7Y29uc3Qgcz1hd2FpdCB0aGlzLl9jYWNoZWRUaWxlKGUpO3JldHVybiBzPyhhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9sYXllck5hbWVzLm1hcChhc3luYyBhPT57Y29uc3QgZj1zLmxheWVyc1thXTtpZighZilyZXR1cm5bXTtjb25zdCBkPWF3YWl0IHRoaXMuX3BpY2tGZWF0dXJlcyhuLHIsaSxmLG8pO3JldHVybiBkfHxbXX0pKSkuZmxhdCgpOltdfWNhdGNoe3JldHVybltdfX1hc3luYyBfcGlja0ZlYXR1cmVzKGUsbixyLGksbyl7Y29uc3Qgcz10aGlzLl90aWxpbmdTY2hlbWUudGlsZVhZVG9OYXRpdmVSZWN0YW5nbGUoZS54LGUueSxlLmxldmVsKSxoPVtzLndlc3Qscy5lYXN0XSxhPVtzLm5vcnRoLHMuc291dGhdLGY9ZnVuY3Rpb24oYixNLG0sRyxRKXtjb25zdCBIPW5ldyB4O3guc3VidHJhY3QoYixuZXcgeChNWzBdLG1bMF0pLEgpO2NvbnN0IGl0PW5ldyB4KChHWzFdLUdbMF0pLyhNWzFdLU1bMF0pLChRWzFdLVFbMF0pLyhtWzFdLW1bMF0pKTtyZXR1cm4geC5hZGQoeC5tdWx0aXBseUNvbXBvbmVudHMoSCxpdCxuZXcgeCksbmV3IHgoR1swXSxRWzBdKSxuZXcgeCl9LGQ9W10sXz1bMCxpLmV4dGVudC0xXSxTPShfWzFdLV9bMF0pL3RoaXMuX3RpbGVXaWR0aCxPPWYoeC5mcm9tQ2FydGVzaWFuMyh0aGlzLl90aWxpbmdTY2hlbWUucHJvamVjdGlvbi5wcm9qZWN0KG5ldyB6KG4scikpKSxoLGEsXyxfKSx3PW5ldyBlbihPLngsTy55KTtmb3IobGV0IGI9MDtiPGkubGVuZ3RoO2IrKyl7Y29uc3QgTT1pLmZlYXR1cmUoYik7aWYoWHQudHlwZXNbTS50eXBlXT09PSJQb2x5Z29uIiYmY2woTS5sb2FkR2VvbWV0cnkoKSx3KXx8WHQudHlwZXNbTS50eXBlXT09PSJMaW5lU3RyaW5nIiYmJHUoTS5sb2FkR2VvbWV0cnkoKSx3LCRpKHRoaXMuX3BpY2tMaW5lV2lkdGgsTSxlKSpTKXx8WHQudHlwZXNbTS50eXBlXT09PSJQb2ludCImJkd1KE0ubG9hZEdlb21ldHJ5KCksdywkaSh0aGlzLl9waWNrUG9pbnRSYWRpdXMsTSxlKSpTKSl7Y29uc3QgbT1ubChNLGUsbyk7bSYmZC5wdXNoKG0pfX1yZXR1cm4gZH1hc3luYyBfY2FjaGVkVGlsZShlKXt2YXIgbixyO2lmKGUpe2lmKChuPXRoaXMuX3RpbGVDYWNoZXMpIT1udWxsJiZuLmhhcyhlKSlyZXR1cm4gdGhpcy5fdGlsZUNhY2hlcy5nZXQoZSk7dHJ5e2NvbnN0IGk9eWwoYXdhaXQgdGhpcy5fcGFyc2VUaWxlKGUpKTtyZXR1cm4gaSYmKChyPXRoaXMuX3RpbGVDYWNoZXMpPT1udWxsfHxyLnNldChlLGkpKSxpfWNhdGNoe3JldHVybn19fWNsZWFyQ2FjaGUoKXt2YXIgZTsoZT10aGlzLl90aWxlQ2FjaGVzKT09bnVsbHx8ZS5jbGVhcigpfX1jb25zdCBsbD1hc3luYyB0PT57dHJ5e2NvbnN0IGU9YXdhaXQgcGwodCk7cmV0dXJuIGU/X2woZSk6dm9pZCAwfWNhdGNoe3JldHVybn19LGRsPTUsRWw9NSxfbD10PT5uZXcgRG8obmV3IEJvKHQpKSxwbD1hc3luYyB0PT57aWYoIXQpe2NvbnNvbGUuZXJyb3IoImZldGNoIHJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgcmVxdWVzdCB1cmwgaXMgdW5kZWZpbmVkIik7cmV0dXJufXRyeXtjb25zdCBlPWF3YWl0IGZldGNoKHQpO3JldHVybiBlLm9rP2F3YWl0IGUuYXJyYXlCdWZmZXIoKTp2b2lkIDB9Y2F0Y2h7cmV0dXJufX0seWw9dD0+e3ZhciBuO2lmKCF0KXJldHVybjtjb25zdCBlPXt9O2Zvcihjb25zdFtyLGldb2YgT2JqZWN0LmVudHJpZXModC5sYXllcnMpKXtjb25zdCBvPVtdLHM9aTtmb3IobGV0IGg9MDtoPHMubGVuZ3RoO2grKyl7Y29uc3QgYT1zLmZlYXR1cmUoaCk7bGV0IGY7Y29uc3QgZD0obj1hLmJib3gpPT1udWxsP3ZvaWQgMDpuLmNhbGwoYSksXz17Li4uYSxpZDphLmlkLGxvYWRHZW9tZXRyeTooKT0+KGZ8fChmPWEubG9hZEdlb21ldHJ5KCkpLGYpLGJib3g6ZD8oKT0+ZDp2b2lkIDAsdG9HZW9KU09OOmEudG9HZW9KU09OfTtvLnB1c2goXyl9ZVtyXT17Li4ucyxmZWF0dXJlOmg9Pm9baF19fXJldHVybntsYXllcnM6ZX19LEdpPSh0LGUpPT5kZWNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZSgie3p9IixTdHJpbmcoZS5sZXZlbCkpLnJlcGxhY2UoInt4fSIsU3RyaW5nKGUueCkpLnJlcGxhY2UoInt5fSIsU3RyaW5nKGUueSkpO2Z1bmN0aW9uICRpKHQsZSxuKXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q6dChlLG4pfWNvbnN0IEFsPW5ldyBNYXA7ZnVuY3Rpb24geGwoe3VybFRlbXBsYXRlOnQsbWF4aW11bUxldmVsOmV9KXtyZXR1cm5gJHt0fToke2V9YH1hc3luYyBmdW5jdGlvbiBPbCh0KXtjb25zdCBlPXhsKHQpO2xldCBuO3JldHVybiBuPT1udWxsJiYobj1uZXcgZmwodCksQWwuc2V0KGUsbikpLG59ZW8oe3JlbmRlclRpbGU6YXN5bmMoe3JlcXVlc3RlZFRpbGU6dCxjYW52YXM6ZSxzY2FsZUZhY3RvcjpuLC4uLnJ9KT0+e2NvbnN0IGk9ZS5nZXRDb250ZXh0KCIyZCIpO2lmKCFpKXJldHVybjtjb25zdCBvPWF3YWl0IE9sKHIpO2F3YWl0IG8ucmVuZGVyKGksdCxuLHIuY3VycmVudExheWVyKSxvLmNsZWFyQ2FjaGUoKSxhd2FpdCBuZXcgUHJvbWlzZShzPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHMpfSl9fSl9KSgpOwo=",Wz=typeof window<"u"&&window.Blob&&new Blob([atob(Uz)],{type:"text/javascript;charset=utf-8"});function UMe(){const e=Wz&&(window.URL||window.webkitURL).createObjectURL(Wz);try{return e?new Worker(e):new Worker("data:application/javascript;base64,"+Uz)}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const Kh=[];function WMe(e){let t=Kh.find(n=>n.layerId===e);return t==null&&(t=ZMe(async()=>await XMe(new UMe),{size:Math.ceil(navigator.hardwareConcurrency/4)}),t.layerId=e,Kh.push(t)),t}function BMe(e,t){return WMe(t).queue(n=>e(n,t))}function YMe(e,t){const n=Kh.find(i=>i.layerId===e);return n==null||n.taskQueue.length<t}async function HMe(e){const t=Kh.findIndex(n=>n.layerId===e);t!==-1&&(await Kh[t].terminate(!0),Kh.splice(t,1))}async function jMe(e){var t;const{canvas:n,...i}=e,r=n.transferControlToOffscreen();await BMe(async o=>{await o.renderTile(DMe({canvas:r,...i},[r]))},(t=e.currentLayer)==null?void 0:t.id)}let s0;const KS=class{constructor(e){st(this,"taskCount",0),st(this,"tileCache"),st(this,"_minimumLevel"),st(this,"_maximumLevel"),st(this,"_credit"),st(this,"_resolution"),st(this,"_tilingScheme"),st(this,"_tileWidth"),st(this,"_tileHeight"),st(this,"_rectangle"),st(this,"_ready"),st(this,"_readyPromise",Promise.resolve(!0)),st(this,"_errorEvent",new M.Event),st(this,"_currentLayer"),st(this,"_useWorker"),st(this,"_urlTemplate"),st(this,"_layerNames"),st(this,"_pickPointRadius"),st(this,"_pickLineWidth"),this._minimumLevel=e.minimumLevel??0,this._maximumLevel=e.maximumLevel??24,this._credit=e.credit,this._resolution=e.resolution??10,this._tilingScheme=new M.WebMercatorTilingScheme,this._tileWidth=Wl,this._tileHeight=Wl,this._rectangle=this._tilingScheme.rectangle,this._ready=!0,this._urlTemplate=e.urlTemplate,this._layerNames=e.layerName.split(/, */).filter(Boolean),this._currentLayer=e.layer,this._useWorker=e.worker??!1,this._pickPointRadius=e.pickPointRadius,this._pickLineWidth=e.pickLineWidth}get tileWidth(){return this._tileWidth}get tileHeight(){return this._tileHeight}get maximumLevel(){return this._maximumLevel}get minimumLevel(){return this._minimumLevel}get tilingScheme(){return this._tilingScheme}get rectangle(){return this._rectangle}get errorEvent(){return this._errorEvent}get ready(){return this._ready}get hasAlphaChannel(){return!0}get credit(){return this._credit?new M.Credit(this._credit):void 0}get defaultNightAlpha(){}get defaultDayAlpha(){}get defaultAlpha(){}get defaultBrightness(){}get defaultContrast(){}get defaultHue(){}get defaultSaturation(){}get defaultGamma(){}get defaultMinificationFilter(){}get defaultMagnificationFilter(){}get readyPromise(){return this._readyPromise}get tileDiscardPolicy(){}get proxy(){}getTileCredits(e,t,n){return[]}requestImage(e,t,n,i){var r;const o=this._currentLayer;if(!o||(s0&&o&&!MCe(s0,o)&&s0.id===o.id&&HMe(s0.id),s0=o,this._useWorker&&(this.taskCount>=KS.maximumTasksPerImagery||!YMe(o?.id,KS.maximumTasks))))return;const s=`${e}/${t}/${n}`;if(((r=this.tileCache)==null?void 0:r.has(s))===!0){const f=this.tileCache.get(s);return Promise.resolve(f)}const a=document.createElement("canvas"),c={x:e,y:t,level:n},l=(n>=this.maximumLevel?this._resolution:void 0)??1;a.width=this._tileWidth*l,a.height=this._tileHeight*l;const u=this._urlTemplate,h=this._layerNames,d=this._maximumLevel;return++this.taskCount,jMe({canvas:a,requestedTile:c,scaleFactor:l,urlTemplate:u,layerNames:h,maximumLevel:d,currentLayer:o,pickPointRadius:this._pickPointRadius,pickLineWidth:this._pickLineWidth}).then(()=>{var f;return(f=this.tileCache)==null||f.set(s,a),a}).catch(f=>{if(f instanceof Error&&f.message.startsWith("Unimplemented type"))return a;throw f}).finally(()=>{--this.taskCount})}async pickFeatures(e,t,n,i,r){const o={x:e,y:t,level:n},s=this._currentLayer,a=this._urlTemplate,c=this._layerNames;return await new hIe({urlTemplate:a,layerNames:c}).pickFeatures(o,i,r,s)??[]}};let JS=KS;st(JS,"maximumTasks",50),st(JS,"maximumTasksPerImagery",6);const Rb=(e,t,n)=>{const{hideIndicator:i}=n??{},{viewer:r}=$n(),o=n?.alpha;R.useEffect(()=>{if(!e||!r)return;const s=r.imageryLayers,a=s.addImageryProvider(e);return Object.assign(a,{bringToFront:()=>{s.raiseToTop(a)},sendToBack:()=>{s.lowerToBottom(a)}}),o!==void 0&&typeof o=="number"&&(a.alpha=o),xo(a,{layerId:t,hideIndicator:i}),()=>{s.remove(a)}},[e,r,t,o,i])},Ib=e=>R.useMemo(()=>{const t=Vl(e);return{type:t?.type,url:t?.url,layers:t?.layers?Array.isArray(t.layers)?t.layers.join(","):t?.layers:void 0,parameters:t?.parameters}},[e]);function Bz(e,t){if(!e)return"";let n=e.replace("/%7Bz%7D","/{z}").replace("/%7Bx%7D","/{x}").replace("/%7By%7D","/{y}");return n.includes("/{z}/{x}/{y}.")||(n[n.length-1]!=="/"&&(n+="/"),n+="{z}/{x}/{y}."+t),n}const KMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c,layers:l}=Ib(n),u=Ds(n)||void 0,h=R.useMemo(()=>{if(!(!e||!i||!c||!l||a!=="mvt"))return new JS({minimumLevel:r,maximumLevel:o,credit:s,urlTemplate:Bz(c,"mvt"),layerName:l,layer:u,worker:!0})},[e,i,c,l,a,r,o,s,u]);Rb(h,n?.id,t)},JMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c}=Ib(n),l=R.useMemo(()=>{if(!(!e||!i||!c||a!=="tiles"))return new M.UrlTemplateImageryProvider({url:Bz(c,"png"),minimumLevel:r,maximumLevel:o,credit:s})},[e,i,c,a,r,o,s]);Rb(l,n?.id,t)},QMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c}=Ib(n),[l,u]=R.useState();R.useEffect(()=>{if(!e||!i||!c||a!=="tms")return;(async()=>u(await M.TileMapServiceImageryProvider.fromUrl(c,{minimumLevel:r,maximumLevel:o,credit:s})))()},[e,i,c,a,r,o,s]),Rb(l,n?.id,t)},qMe=({isVisible:e,property:t,layer:n})=>{const{show:i=!0,minimumLevel:r,maximumLevel:o,credit:s}=t??{},{type:a,url:c,layers:l,parameters:u}=Ib(n),h=R.useMemo(()=>{if(!(!e||!i||!c||!l||a!=="wms"))return new M.WebMapServiceImageryProvider({url:c,layers:l,minimumLevel:r,maximumLevel:o,credit:s,parameters:u})},[e,i,c,l,a,r,o,s,u]);Rb(h,n?.id,t)};function $Me({isVisible:e,layer:t,property:n}){return qMe({isVisible:e,layer:t,property:n}),JMe({isVisible:e,layer:t,property:n}),QMe({isVisible:e,layer:t,property:n}),KMe({isVisible:e,layer:t,property:n}),null}const e5e=R.memo($Me,(e,t)=>vr(Ds(e.layer)?.polygon,Ds(t.layer)?.polygon)&&vr(Ds(e.layer)?.polyline,Ds(t.layer)?.polyline)&&vr(Ds(e.layer)?.marker,Ds(t.layer)?.marker)&&vr(Vl(e.layer),Vl(t.layer))&&vr(e.property,t.property)&&e.isVisible===t.isVisible&&e.evalFeature===t.evalFeature&&e.onComputedFeatureFetch===t.onComputedFeatureFetch),t5e={noFeature:!0};function Yz(e,t){const n=e.position?.getValue(t);return[n?.x??0,n?.y??0,n?.z??0]}function Mb(e,t){if(t.point||t.billboard||t.label)return{type:"Point",coordinates:Yz(t,e)};if(t.polyline)return{type:"LineString",coordinates:t.polyline?.positions?.getValue(e)?.map(o=>[o?.x??0,o?.y??0,o?.z??0])};if(t.polygon)return{type:"Polygon",coordinates:[t.polygon?.hierarchy?.getValue(e)?.positions?.map(o=>[o?.x??0,o?.y??0,o?.z??0])]}}function n5e(e,t,n,i){const r=t?.originalProperties||{};xo(e,{...t||{},originalProperties:{...r,[n]:{...r[n],...i}}})}function a0(e,t,n,i){const[r,o]=n,s=e[o]??{};if(!e[o])return;const a=Tt(e),l=(a?.originalProperties||{})[r];let u=!1;Object.entries(i).forEach(([h,d])=>{const f=d.name,p=d.type;let m=d.override??t?.[r]?.[f];const y=m==null&&!!d.default;if(m=m??d.default,!((m==null||y)&&!l)){switch(u=!0,p){case"color":m=fc(m);break;case"shadows":m=dc(m);break;case"heightReference":m=ha(m);break;case"classificationType":m=hf(m)}m!==e[o][h]&&(e[o][h]=m??s[h])}}),n5e(e,a,r,u)}const c0=(e,t,n)=>!!(Ds(e)?.[n[0]]&&t[n[1]]),Lb=e=>String(e.id),Hz=(e,t,n,i)=>{if(!t)return;const r=c0(t,e,["marker","point"]),o=c0(t,e,["marker","billboard"]),s=c0(t,e,["marker","label"]);if(e.point||e.billboard||e.label){const a=Yz(e,i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a[0],y:a[1],z:a[2]}},u=n(t.layer,l);return u?(r&&(u?.marker?.style==="point"&&!e.point&&(e.point=new M.PointGraphics,e.billboard=void 0),a0(e,u,["marker","point"],{show:{name:"show",...u?.marker?.style?{override:u?.marker?.style==="point"&&(u?.marker.show??!0)}:{}},pixelSize:{name:"pointSize"},color:{name:"pointColor",type:"color"},outlineColor:{name:"pointOutlineColor",type:"color"},outlineWidth:{name:"pointOutlineWidth"},heightReference:{name:"heightReference",type:"heightReference"}})),o&&(u?.marker?.style==="image"&&!e.billboard&&(e.billboard=new M.BillboardGraphics,e.point=void 0),a0(e,u,["marker","billboard"],{show:{name:"show",...u?.marker?.style?{override:u?.marker?.style==="image"&&(u?.marker.show??!0)}:{}},image:{name:"image"},color:{name:"imageColor",type:"color"},scale:{name:"imageSize"},sizeInMeters:{name:"imageSizeInMeters"},heightReference:{name:"heightReference",type:"heightReference"},horizontalOrigin:{name:"imageHorizontalOrigin"},verticalOrigin:{name:"imageVerticalOrigin"}}),s&&a0(e,u,["marker","label"],{show:{name:"show",default:!0},text:{name:"labelText"},backgroundColor:{name:"labelBackground",type:"color"},heightReference:{name:"heightReference",type:"heightReference"}})),[l,u]):void 0}if(e.polyline){const a=e.position?.getValue(i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a?.x??0,y:a?.y??0,z:a?.z??0}},u=n(t.layer,l);return u?(c0(t,e,["polyline","polyline"])&&a0(e,u,["polyline","polyline"],{show:{name:"show",default:!0},width:{name:"strokeWidth"},material:{name:"strokeColor",type:"color"},shadows:{name:"shadows",type:"shadows"},clampToGround:{name:"clampToGround"},classificationType:{name:"classificationType",type:"classificationType"}}),[l,u]):void 0}if(e.polygon){const a=e.position?.getValue(i),c=Mb(i,e),l={type:"feature",id:Lb(e),geometry:c,properties:Rh(i,e),metaData:{description:Ih(i,e)},range:{x:a?.x??0,y:a?.y??0,z:a?.z??0}},u=n(t.layer,l);return u?(c0(t,e,["polygon","polygon"])&&a0(e,u,["polygon","polygon"],{show:{name:"show",default:!0},fill:{name:"fill"},material:{name:"fillColor",type:"color"},outline:{name:"stroke"},outlineColor:{name:"strokeColor",type:"color"},outlineWidth:{name:"strokeWidth"},shadows:{name:"shadows",type:"shadows"},heightReference:{name:"heightReference",type:"heightReference"},extrudedHeight:{name:"extrudedHeight"},classificationType:{name:"classificationType",type:"classificationType"}}),[l,u]):void 0}},i5e={kml:"kml",geojson:"geojson",czml:"czml"},r5e={kml:Lie,czml:tie,geojson:bie};function o5e({isVisible:e,property:t,layer:n,onComputedFeatureFetch:i,onComputedFeatureDelete:r}){const{show:o=!0,clampToGround:s,stroke:a,strokeWidth:c,markerColor:l,markerSize:u,fill:h,hideIndicator:d}=t??{},[f,p,m]=R.useMemo(()=>{const w=Vl(n),x=t?.type,I=t?.url;return[x??w?.type,I??w?.url,w?.time?.updateClockOnLoad??!0]},[t,n]),{viewer:y}=$n(),g=R.useRef([]),v=R.useRef(new Set),S=R.useMemo(()=>!f||f==="auto"?Rm(p):void 0,[f,p]),T=S?i5e[S]:f!=="auto"?f:void 0,C=T?r5e[T]:void 0,{requestRender:O,timelineManagerRef:V}=ai(),A=R.useCallback(w=>{if(!y)return;const x=[],I=[];w.entities.values.forEach(X=>{const D=Hz(X,n,rm,y.clock.currentTime),[Y,H]=D||[];xo(X,{layerId:n?.id,featureId:Y?.id,hideIndicator:H?.resource?.hideIndicator}),Y&&!v.current.has(Y.id)&&(x.push(Y),g.current.push({feature:Y,raw:X}),v.current.add(Y.id)),H&&I.push(H)}),f!=="geojson"&&i?.(x,I),O?.()},[n,y,i,f,O]),G=R.useCallback(w=>{w.entities.values.forEach(x=>requestAnimationFrame(()=>{const I=Tt(x);xo(x,{layerId:n?.id,featureId:Lb(x),hideIndicator:d??I?.hideIndicator})})),m&&w.clock&&V?.current?.commit({cmd:"SET_TIME",payload:{start:M.JulianDate.toDate(w.clock.startTime),stop:M.JulianDate.toDate(w.clock.stopTime),current:M.JulianDate.toDate(w.clock.currentTime)},committer:{source:"featureResource",id:n?.id}}),O?.()},[m,V,n?.id,O,d]),k=R.useMemo(()=>a?M.Color.fromCssColorString(a):void 0,[a]),N=R.useMemo(()=>h?M.Color.fromCssColorString(h):void 0,[h]),P=R.useMemo(()=>l?M.Color.fromCssColorString(l):void 0,[l]);return R.useEffect(()=>{y&&g.current.forEach(w=>{Hz(w.raw,n,rm,y.clock.currentTime)})},[n,y]),R.useEffect(()=>()=>{lC(()=>{r?.(Array.from(v.current.values()))})},[]),!e||!o||!C||!p?null:ce.jsx(C,{data:p,show:!0,clampToGround:s,onChange:A,onLoad:G,stroke:k,fill:N,strokeWidth:c,markerSize:u,markerColor:P})}const s5e={noFeature:!0},QS={fill:!0,fillColor:"#FFFFFF22",stroke:!0,strokeColor:"#FFFFFF",strokeWidth:1},a5e=({coordiantes:e,top:t=0,bottom:n=0,visible:i,style:r,ready:o})=>{const s=eS(()=>e?new M.PolygonHierarchy(e.map(c=>M.Cartesian3.fromDegrees(c[0],c[1],c[2]??0))):void 0,[e??[]],vr),a=R.useMemo(()=>({...QS,...r,fillColor:ei(r?.fillColor??QS.fillColor),strokeColor:ei(r?.strokeColor??QS.strokeColor)}),[r]);return ce.jsx(zr,{hideIndicator:!0,children:ce.jsx(zM,{hierarchy:s,fill:a.fill,material:a.fillColor,outline:a.stroke,outlineColor:a.strokeColor,outlineWidth:a.strokeWidth,height:n,extrudedHeight:t,show:i&&o})})},c5e=e=>{const t=R.useRef(e);return t.current=e,t},jz=e=>{const t=R.useRef(e),n=R.useCallback(()=>t.current,[]);return R.useEffect(()=>{t.current=e},[e]),n};class l5e{records=new Map;constructor(){}has(t){return this.records.has(t)}find(t){}}class u5e extends l5e{has(t){return this.records.has(t)}find(t){const n=this.records.get(t);if(n!=null)return n.map(({content:i,batchId:r})=>i.getFeature(r))}addFeature(t,n,i){if(i==null)return;const r=this.records.get(i);r==null?this.records.set(i,[{content:t,batchId:n}]):r.push({content:t,batchId:n})}deleteFeature(t){t!=null&&this.records.has(t)&&this.records.delete(t)}}const h5e=[{normal:{x:0,y:0,z:1},distance:.5},{normal:{x:0,y:0,z:-1},distance:.5},{normal:{x:0,y:1,z:0},distance:.5},{normal:{x:0,y:-1,z:0},distance:.5},{normal:{x:1,y:0,z:0},distance:.5},{normal:{x:-1,y:0,z:0},distance:.5}],d5e=({clipping:e,boxId:t})=>{const{useBuiltinBox:n,visible:i,allowEnterGround:r,coordinates:o,width:s,height:a,length:c,heading:l,pitch:u,roll:h,disabledSelection:d}=e||{},{viewer:f}=$n(),p=R.useRef(!1),m=R.useRef(!1),y=R.useRef(void 0),[g,v]=R.useState(o);R.useEffect(()=>{n&&!g&&v(o)},[g,o,n]);const[S,T]=R.useState({width:s,height:a,length:c,heading:l,pitch:u,roll:h});R.useEffect(()=>{n&&!S&&T({width:s,height:a,length:c,heading:l,pitch:u,roll:h})},[S,s,a,c,l,u,h,n]);const[C,O]=R.useState({activeBox:!1,activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1,cursor:"default"}),V=R.useCallback(J=>{O(z=>({...z,...J}))},[]),A=R.useCallback(J=>{if(!f||!d)return;const z=f.scene.pick(J.position),W=qS(z);if(W?.startsWith(`${t}-scale-point`)){const Q=Number(W.split("-").slice(-1)[0]);V({cursor:"nesw-resize",activeScalePointIndex:Q,isScalePointClicked:!0})}if(W?.startsWith(`${t}-edge-draggable`)){const Q=Number(W.split("-").slice(-1)[0]);V({cursor:"grabbing",activeEdgeIndex:Q,isEdgeClicked:!0})}if(W?.startsWith(`${t}-plane`)&&(p.current=!0,m.current=W.endsWith("top")||W.endsWith("bottom")),p.current){const Q=lo(f);y.current=Q,Yu(f,!1),(!C.isScalePointClicked||!C.isEdgeClicked)&&V({cursor:"grabbing",activeBox:!0})}},[t,C,V,f,d]),G=R.useCallback(()=>{!f||!d||((C.activeScalePointIndex||C.activeEdgeIndex)&&V({cursor:"default",activeScalePointIndex:void 0,isScalePointClicked:!1,activeEdgeIndex:void 0,isEdgeClicked:!1}),p.current&&(Yu(f,!0),y.current=void 0,p.current=!1,m.current=!1,C.activeBox=!1,C.cursor="default",V({activeBox:!1,cursor:"default"})))},[C,V,f,d]),k=R.useRef(0),N=R.useCallback(async J=>{if(!p.current||!f||!d)return;const z=M.Cartesian3.fromDegrees(g?.[0]||0,g?.[1]||0,g?.[2]);if(m.current){const W=g?.[2]||0,Q=(()=>{if(!r){const fe=W-(S?.height||0)/2,Xe=k.current;if(fe<Xe)return W+(Xe-fe)}})(),q=new M.Cartesian2(J.startPosition.x,J.startPosition.y),se=new M.Cartesian2(J.endPosition.x,J.endPosition.y),Ce=M.Cartesian2.subtract(se,q,new M.Cartesian2),_e=new M.Cartesian3(0,0,Ce.y<0?-1:1),{moveAmount:Ve}=s1e(f.scene,{startPosition:q,endPosition:se},z,_e),Ae=M.Cartesian3.multiplyByScalar(_e,Ve,new M.Cartesian3);v(fe=>[fe?.[0]||0,fe?.[1]||0,(Q||fe?.[2]||0)+Ae.z])}else{const W=J.endPosition?Yv(f.scene,J.endPosition.x,J.endPosition.y,!r):void 0;v(Q=>[W?.lng||0,W?.lat||0,(r?Q?.[2]:W?.height)||0]),Bu(f.scene,g?.[0]||0,g?.[1]||0).then(Q=>{k.current=Q||0})}},[r,g,S?.height,f,d]),P=R.useCallback(({layerId:J}={})=>{const z=!C.isScalePointClicked&&!C.isEdgeClicked&&!p.current;if(J?.startsWith(`${t}-scale-point`)&&z){const W=Number(J.split("-").slice(-1)[0]);V({cursor:"nesw-resize",activeScalePointIndex:W})}if(J?.startsWith(`${t}-edge-draggable`)&&z){const W=Number(J.split("-").slice(-1)[0]);V({cursor:"grab",activeEdgeIndex:W})}J?.startsWith(`${t}-plane`)&&z&&V({cursor:"grab",activeBox:!0})},[t,C.isEdgeClicked,C.isScalePointClicked,V]),w=R.useCallback(({layerId:J}={})=>{const z=!C.isScalePointClicked&&!C.isEdgeClicked&&!p.current;J?.startsWith(`${t}-scale-point`)&&z&&V({cursor:"default",activeScalePointIndex:void 0}),J?.startsWith(`${t}-edge-draggable`)&&z&&V({cursor:"default",activeEdgeIndex:void 0}),J?.startsWith(`${t}-plane`)&&z&&V({cursor:"default",activeBox:!1})},[t,C.isEdgeClicked,C.isScalePointClicked,V]),x=R.useRef(void 0),I=R.useCallback(J=>{const z=f?.scene.pick(J.endPosition);if(x.current!==z){if(x.current){const W=qS(x.current);w({layerId:W}),w()}if(z){const W=qS(z);P({layerId:W}),P()}}N(J),x.current=z},[P,w,N,f?.scene]),X=R.useCallback(J=>{if(J.layerId?.startsWith(`${t}-scale-point`)&&J.scale){const z=J.scale;T(W=>({...W,width:z.width,height:z.height,length:z.length})),v([z.location.lng,z.location.lat,z.location.height])}if(J.layerId?.startsWith(`${t}-edge-draggable`)&&J.rotate){const z=J.rotate;T(W=>({...W,heading:z.heading,pitch:z.pitch,roll:z.roll}))}},[t]),D=R.useMemo(()=>new M.ScreenSpaceEventHandler(f?.scene.canvas),[f]);R.useEffect(()=>{D.setInputAction(A,M.ScreenSpaceEventType.LEFT_DOWN),D.setInputAction(I,M.ScreenSpaceEventType.MOUSE_MOVE),D.setInputAction(G,M.ScreenSpaceEventType.LEFT_UP)},[D,A,I,G]),R.useEffect(()=>()=>{requestAnimationFrame(()=>{D.isDestroyed()||D.destroy()})},[D]);const Y=R.useMemo(()=>({...C,...S,allowEnterGround:r}),[C,S,r]),H=R.useMemo(()=>n?{visible:i,handleLayerEdit:X,geometry:{type:"Point",coordinates:g||o||[0,0,0]},property:Y}:void 0,[Y,o,g,X,n,i]);return{...e,planes:n?h5e:e?.planes,width:n?S?.width:e?.width,height:n?S?.height:e?.height,length:n?S?.length:e?.length,heading:n?S?.heading:e?.heading,pitch:n?S?.pitch:e?.pitch,roll:n?S?.roll:e?.roll,coordinates:n?g:e?.coordinates,builtinBoxProps:H}};function qS(e){if(e&&"id"in e&&e.id instanceof M.Entity)return Tt(e.id)?.layerId;if(e&&e instanceof M.Cesium3DTileFeature)return Tt(e.tileset)?.layerId}const f5e=({enabled:e,surfacePoints:t,direction:n="inside",top:i,bottom:r,visible:o=!0,style:s,tilesetRef:a,viewer:c,clippingPlanes:l,isTilesetReady:u})=>{const[h,d]=R.useState(0),f=R.useMemo(()=>i??100,[i]),p=R.useMemo(()=>r??10,[r]),[m,y]=R.useState(!1),{requestRender:g}=ai();R.useEffect(()=>{(async()=>{if(!a?.current||!u)return;if(!e||!t||t?.length<2){l.removeAll(),d(0),g?.();return}l.modelMatrix=M.Matrix4.IDENTITY.clone(),y(!1);const T=sl([t.map(G=>[G.lng,G.lat])]),C=I1e(T),O=c?.scene?await Bu(c?.scene,C.geometry.coordinates[0],C.geometry.coordinates[1])??0:0;d(O);const V=M.Matrix4.inverse(M.Transforms.eastNorthUpToFixedFrame(a.current.boundingSphere.center),new M.Matrix4);let A=0;for(let G=0;G<t.length;G++){const k=t[G],N=t[(G+1)%t.length];A+=(N.lng-k.lng)*(N.lat+k.lat)}A>0&&t.reverse(),l.removeAll();for(let G=0;G<t.length-1;G++){const k=t[G],N=t[G+1];l.add(p5e(k,N,V,n))}l.add(Kz(t[0],O+f,V,n==="inside"?1:-1)),l.add(Kz(t[0],O-p,V,n==="inside"?-1:1)),y(!0)})()},[t,a,l,f,p,e,n,c,u,g]),R.useEffect(()=>{l.unionClippingRegions=n==="outside"},[l,n,e]);const v=R.useMemo(()=>({coordiantes:t?.map(S=>[S.lng,S.lat])??[],top:h+f,bottom:h-p,visible:o,style:s,ready:m}),[t,h,f,p,o,s,m]);return{drawClippingEnabled:e,drawClippingEdgeProps:v}},$S=(e,t,n)=>{const i=M.Cartesian3.fromDegrees(e.lng,e.lat,n);return M.Matrix4.multiplyByPoint(t,i,new M.Cartesian3)},p5e=(e,t,n,i)=>{const r=$S(e,n),o=$S(t,n),s=new M.Cartesian3(0,0,1),a=new M.Cartesian3(0,0,-1),c=M.Cartesian3.subtract(o,r,new M.Cartesian3),l=i==="inside"?M.Cartesian3.normalize(M.Cartesian3.cross(c,s,new M.Cartesian3),new M.Cartesian3):M.Cartesian3.normalize(M.Cartesian3.cross(c,a,new M.Cartesian3),new M.Cartesian3),u=M.Plane.fromPointNormal(r,l);return M.ClippingPlane.fromPlane(u)},Kz=(e,t,n,i)=>{const r=$S(e,n,t),o=new M.Cartesian3(0,0,i),s=M.Plane.fromPointNormal(r,o);return M.ClippingPlane.fromPlane(s)},Jz=M.Color.WHITE,m5e=e=>R.useMemo(()=>{const t=Vl(e);return{type:t?.type,url:t?.url,idProperty:t?.idProperty,layers:t?.layers?Array.isArray(t.layers)?t.layers.join(","):t?.layers:void 0,googleMapApiKey:t?.serviceTokens?.googleMapApiKey,provider:t?.provider}},[e]),Qz=(e,t,n)=>{const i=t.tile.boundingSphere.center,r=n&&!(e instanceof M.Model)?e.getProperty(n):void 0;if(r)return r;const o=y5e(e);return Ty(`${i.x}-${i.y}-${i.z}-${o}-${e instanceof M.Model?"":JSON.stringify(Object.entries(Mp(e)).filter((s,a)=>typeof a=="string"||typeof a=="number").map(([s,a])=>`${s}${a}`))}`)},g5e=(e,t,n)=>{const i=t.tile.boundingSphere.center;return{type:"feature",id:Qz(e,t,n),geometry:{type:"Point",coordinates:[i.x,i.y,i.z]},range:{x:i.x,y:i.y,z:i.z}}},y5e=e=>(e instanceof M.Model?e.id:e instanceof M.Cesium3DTileFeature?e.featureId:"")??"",b5e=5e3,_5e=[{name:"color",convert:"color"},{name:"show"}],v5e=[{name:"color",convert:"colorFunctionString"},{name:"show"},{name:"pointSize"},{name:"meta"}],w5e=[{name:"pointSize"}],x5e=["show","color","pointSize","meta"],eE=(e,t)=>t==="color"?ei(e):t==="colorFunctionString"?e===void 0?e:`color("${e}")`:e,S5e=({id:e,tilesetRef:t,idProperty:n,layer:i,viewer:r,featureIndex:o,selectedFeatureIdsRef:s,evalFeature:a,onComputedFeatureFetch:c,shouldUseFeatureIndex:l,isTilesetReady:u,useExternalStyle:h})=>{const d=R.useRef([]),f=R.useRef(i),p=R.useRef(new Set),m=i?.id||e,y=c5e(m),g=R.useCallback(async x=>{const I=f?.current?.layer;if(I?.type==="simple"&&x?.feature){const X=x.raw,D=Tt(X),Y=r&&!(X instanceof M.Model)?Mp(X):{},H=l?s.current.includes(D?.featureId??""):D?.isFeatureSelected,J=a(I,{...x?.feature,properties:Y});if(!h){const z=J?.["3dtiles"];_5e.forEach(({name:W,convert:Q})=>{const q=eE(z?.[W],Q);W==="color"?(X.color=Jz,q!==void 0&&(X.color=q),H&&typeof I["3dtiles"]?.selectedFeatureColor=="string"&&(X.color=ei(I["3dtiles"]?.selectedFeatureColor)??q)):q!==void 0&&(X[W]=q)}),X instanceof M.Cesium3DTilePointFeature&&w5e.forEach(({name:W,convert:Q})=>{const q=eE(z?.[W],Q);q!==void 0&&(X[W]=q)}),"style"in X&&(X.style=new M.Cesium3DTileStyle(v5e.reduce((W,{name:Q,convert:q})=>{const se=eE(z?.[Q],q);return se===void 0?W:{...W,[Q]:se}},{})))}return xo(x.raw,{layerId:m,featureId:x.feature.id,computedFeature:J,isFeatureSelected:D?.isFeatureSelected}),J}},[a,m,r,l,s,h]),v=R.useCallback(async x=>{if(x.tileset.isDestroyed())return;const I=new Set;await Ip(x.content,async(X,D,Y)=>{const H={feature:g5e(X,D,n),raw:X};xo(H.raw,{layerId:y.current,featureId:H.feature.id}),Y!=null&&l&&o.addFeature(D,Y,H.feature.id),await g(H),d.current.push(H),p.current.add(H.feature.id),I.add(Yr(H.feature,["id","type","range"]))}),c?.(Array.from(I.values()),[])},[d,g,c,n,o,l,y]),S=R.useRef(v);S.current=v,R.useEffect(()=>t.current?.tileLoad.addEventListener(x=>S.current(x)),[t,u]);const T=R.useCallback(async x=>{x.tileset.isDestroyed()||!l||await Ip(x.content,async(I,X)=>{o.deleteFeature(Qz(I,X,n))})},[n,o,l]),C=R.useRef(T);C.current=T,R.useEffect(()=>t.current?.tileUnload.addEventListener(x=>C.current(x)),[t,u]),R.useEffect(()=>{f.current=i},[i]);const O=R.useMemo(()=>Ds(i)?.["3dtiles"],[i]),V=$be(O,x5e),A=l?0:i?.layer._updateStyle,G=R.useRef(A),k=R.useRef(void 0);R.useEffect(()=>{k.current=Date.now()},[V,A]);const N=R.useCallback(async(x,I)=>new Promise(X=>requestAnimationFrame(()=>{if(k.current&&k.current>I){X(void 0);return}(V||A)&&g(x),X(void 0)})),[V,g,A]),P=R.useCallback(async x=>{const I=[];let X=!1;for(const D of d.current){if(k.current&&k.current>x){X=!0;break}I.push(N(D,x)),I.length>b5e&&(await Promise.all(I),I.length=0)}X||await Promise.all(I),G.current=A,I.length=0},[N,A]),{requestRender:w}=ai();R.useEffect(()=>{(async()=>{const I=Date.now();await P(I),w?.()})()},[P,w,A])},E5e=({id:e,boxId:t,isVisible:n,property:i,viewerProperty:r,layer:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l})=>{const{viewer:u}=$n(),h=R.useRef(void 0),{onLayerLoad:d,updateCredits:f,customProvider:p}=ai(),m=R.useRef(o?.id);m.current=o?.id;const{tileset:y,styleUrl:g,edgeColor:v,edgeWidth:S,experimental_clipping:T,selectedFeatureColor:C,disableIndexingFeature:O}=i??{},{width:V,height:A,length:G,location:k,coordinates:N,heading:P,roll:w,pitch:x,planes:I,visible:X=!0,direction:D="inside",builtinBoxProps:Y,allowEnterGround:H}=d5e({clipping:T,boxId:t}),[J,z]=R.useState(),{url:W,type:Q,idProperty:q,googleMapApiKey:se,provider:Ce}=m5e(o),_e=!O&&!!q,[Ve,Ae]=R.useState(!1),[fe,Xe]=R.useState(!1),[nt,it]=R.useState(!1),Z=R.useRef(I),pe=R.useMemo(()=>((!Z.current?.length||!Z.current?.every(($e,xt)=>$e.normal?.x===I?.[xt].normal?.x&&$e.normal?.y===I?.[xt].normal?.y&&$e.normal?.z===I?.[xt].normal?.z&&$e.distance===I?.[xt].distance))&&(Z.current=I),Z.current),[I]),he=D==="inside"?-1:1,[$,j]=R.useState(()=>new M.ClippingPlaneCollection({planes:pe?.map($e=>new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he)),unionClippingRegions:D==="outside",edgeWidth:S,edgeColor:ei(v)}));R.useEffect(()=>()=>{j(new M.ClippingPlaneCollection({planes:pe?.map($e=>new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he)),unionClippingRegions:D==="outside",edgeWidth:S,edgeColor:ei(v)}))},[]);const{drawClippingEnabled:ee,drawClippingEdgeProps:le}=f5e({...T?.draw,tilesetRef:h,viewer:u,clippingPlanes:$,isTilesetReady:Ve}),[ge]=R.useState(()=>new u5e),te=R.useCallback($e=>{$e?.cesiumElement&&xo($e.cesiumElement,{layerId:o?.id||e,featureIndex:_e?ge:void 0,appearanceType:"3dtiles"}),o?.id&&$e?.cesiumElement&&(($e?.cesiumElement)[Woe]=o.id),h.current=$e?.cesiumElement,it(!!$e?.cesiumElement)},[e,o?.id,ge,_e]),ue=R.useRef([]),Re=R.useRef(C);Re.current=C;const[ye]=R.useState(()=>new Map);R.useEffect(()=>{!h.current||!_e||!Ve||Object.assign(h.current,{onSelectFeature:$e=>{const xt=Tt($e);xt?.featureId&&(ue.current.push(xt.featureId),ye.set(xt.featureId,$e.color)),Re.current&&($e.color=ei(Re.current)??$e.color)},onUnselectFeature:$e=>{const xt=Tt($e);xt?.featureId&&(ue.current=ue.current.filter(mn=>mn!==xt.featureId)),$e.color=ye.get(xt?.featureId??"")??Jz}})},[ye,ge,_e,Ve]),S5e({id:e,tilesetRef:h,layer:o,idProperty:q,viewer:u,evalFeature:a,onComputedFeatureFetch:c,featureIndex:ge,selectedFeatureIdsRef:ue,shouldUseFeatureIndex:_e,isTilesetReady:Ve,useExternalStyle:!!g});const[Ue,We]=R.useState(0),qe=R.useRef(!1),Xt=R.useCallback($e=>{qe.current||!u||H||(qe.current=!0,T5(u.scene,$e).then(xt=>{We(xt??0),qe.current=!1}))},[H,u]);R.useEffect(()=>{if(T?.draw)return;const $e=N||(k?[k.lng,k.lat,k.height??0]:void 0),xt=M.Cartesian3.fromDegrees($e?.[0]||0,$e?.[1]||0,$e?.[2]||0);(async()=>{if(!h.current||!Ve)return;const kn=h.current.clippingPlanesOriginMatrix.clone(),Jn=new M.Cartesian3(V||100,G||100,A||100);if(!H){const rr=new M.TranslationRotationScale(xt,void 0,Jn);CF(rr,!!H,Ue),xt.x=rr.translation.x,xt.y=rr.translation.y,xt.z=rr.translation.z}const Ni=P&&x&&w?new M.HeadingPitchRoll(P,x,w):void 0,ir=M.Matrix4.multiply(Ni?M.Matrix4.fromRotationTranslation(M.Matrix3.fromHeadingPitchRoll(Ni),xt):M.Transforms.eastNorthUpToFixedFrame(xt),M.Matrix4.fromScale(Jn,new M.Matrix4),new M.Matrix4),Ha=M.Matrix4.inverse(kn,new M.Matrix4);M.Matrix4.multiply(Ha,ir,$.modelMatrix)})(),H||Xt(xt)},[V,G,A,P,x,w,k,N,$.modelMatrix,Xt,H,Ue,T?.draw,Ve]),R.useEffect(()=>{T?.draw||($.enabled=X)},[$,X,T?.draw]),R.useEffect(()=>{T?.draw||($.unionClippingRegions=D==="outside")},[$,D,T?.draw]),R.useEffect(()=>{T?.draw||($.removeAll(),pe?.forEach($e=>$.add(new M.ClippingPlane(new M.Cartesian3($e.normal?.x,$e.normal?.y,$e.normal?.z),($e.distance||0)*he))))},[pe,$,he,T?.draw]),R.useEffect(()=>{if(!g){z(void 0);return}(async()=>{const $e=await fetch(g);if(!$e.ok){console.warn("Failed to fetch style from:",g);return}const xt=await $e.json(),mn=new M.Cesium3DTileStyle(xt);z(mn)})()},[g]),R.useEffect(()=>{J&&h.current&&Ve&&(h.current.style=J)},[J,Ve]);const Be=R.useMemo(()=>Q!=="google-photorealistic"||!n?null:Ce==="reearth"?p?.layers?.providers?.find(mn=>mn.id==="reearth_google_photorealistic_3d_tiles")?.url||W||null:(async()=>{try{return Ce==="cesium-ion"||!se?await M.IonResource.fromAssetId(2275207,{accessToken:s?.cesiumIonAccessToken}):(await M.createGooglePhotorealistic3DTileset({key:se})).resource}catch(xt){throw console.error(`Error loading Photorealistic 3D Tiles tileset: ${xt}`),xt}})(),[Q,n,se,s?.cesiumIonAccessToken,Ce,p,W]),St=R.useMemo(()=>n?Be||(Q==="reearth-buildings"?W??"https://buildings.reearth.land/tileset.json":Q==="osm-buildings"?M.IonResource.fromAssetId(96188,{accessToken:s?.cesiumIonAccessToken}):Q==="3dtiles"?W??y??null:null):null,[Q,n,Be,W,y,s?.cesiumIonAccessToken]),Dt=R.useMemo(()=>{if(!i?.specularEnvironmentMaps&&!i?.sphericalHarmonicCoefficients&&!r?.scene?.imageBasedLighting?.specularEnvironmentMaps&&!r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients)return;const $e=new M.ImageBasedLighting,xt=i?.specularEnvironmentMaps??r?.scene?.imageBasedLighting?.specularEnvironmentMaps,mn=i?.imageBasedLightIntensity??r?.scene?.imageBasedLighting?.intensity,kn=Jx(i?.sphericalHarmonicCoefficients??r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,mn);return xt&&($e.specularEnvironmentMaps=xt),kn&&($e.sphericalHarmonicCoefficients=kn),$e},[i?.specularEnvironmentMaps,i?.sphericalHarmonicCoefficients,i?.imageBasedLightIntensity,r?.scene?.imageBasedLighting?.specularEnvironmentMaps,r?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,r?.scene?.imageBasedLighting?.intensity]),Et=R.useCallback($e=>{Xe(!0),l?.({properties:$e.properties}),d?.({layerId:m.current})},[l,d]);return R.useEffect(()=>{!fe||!nt||Ae(!0)},[fe,nt]),R.useEffect(()=>(f?.(),()=>{f?.()}),[Q,f]),{tilesetUrl:St,ref:te,style:J,clippingPlanes:$,drawClippingEnabled:ee,drawClippingEdgeProps:le,builtinBoxProps:Y,imageBasedLighting:Dt,handleReady:Et}};function T5e({id:e,isVisible:t,property:n,layer:i,feature:r,viewerProperty:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l,...u}){const{shadows:h,colorBlendMode:d,pbr:f,showWireframe:p,showBoundingVolume:m,cacheBytes:y}=n??{},g=`${i?.id}_box`,{tilesetUrl:v,ref:S,style:T,clippingPlanes:C,drawClippingEnabled:O,drawClippingEdgeProps:V,builtinBoxProps:A,imageBasedLighting:G,handleReady:k}=E5e({id:e,boxId:g,isVisible:t,layer:i,property:n,viewerProperty:o,meta:s,evalFeature:a,onComputedFeatureFetch:c,onLayerFetch:l}),N=R.useMemo(()=>({...i?.layer?.type==="simple"?i?.layer?.box:{},...A?.property||{}}),[i?.layer,A?.property]),P=R.useMemo(()=>({...i,id:g}),[i,g]);return!t||!v?null:ce.jsxs(ce.Fragment,{children:[ce.jsx(Wne,{ref:S,url:v,customShader:f===!1?P4:f==="withTexture"?L4:void 0,cacheBytes:y,style:T,shadows:dc(h),clippingPlanes:C,colorBlendMode:$oe(d),imageBasedLighting:G,onReady:k,debugWireframe:p,debugShowBoundingVolume:m,showCreditsOnScreen:!0}),A&&ce.jsx(VF,{...u,id:g,viewerProperty:o,property:N,geometry:A.geometry,feature:r,layer:P,isVisible:A.visible,evalFeature:a,onLayerEdit:A.handleLayerEdit}),O&&ce.jsx(a5e,{...V})]})}const C5e=R.memo(T5e,(e,t)=>e.id===t.id&&e.isVisible===t.isVisible&&e.property===t.property&&e.layer?.layer===t.layer?.layer&&e.viewerProperty===t.viewerProperty&&e.meta===t.meta&&e.evalFeature===t.evalFeature&&e.onComputedFeatureFetch===t.onComputedFeatureFetch&&e.onFeatureDelete===t.onFeatureDelete),R5e={noFeature:!0},I5e=["transition"],M5e=e=>!I5e.includes(e),l0={marker:[a2e,c2e],polyline:[I2e,M2e],polygon:[C2e,R2e],ellipsoid:[y1e,b1e],ellipse:[m1e,g1e],model:[u2e,h2e],"3dtiles":[C5e,R5e],box:[VF,p1e],photooverlay:[b2e,w2e],resource:[o5e,s5e],raster:[e5e,t5e],heatMap:[i2e,o2e],frustum:[T1e,C1e]},L5e={geojson:"auto",csv:"auto",czml:["resource"],kml:["resource"],wms:["raster"],mvt:["raster"],tms:["raster"],"3dtiles":["3dtiles"],"osm-buildings":["3dtiles"],"reearth-buildings":["3dtiles"],"google-photorealistic":["3dtiles"],gpx:"auto",shapefile:"auto",gtfs:"auto",georss:[],gml:[],gltf:["model"],tiles:["raster"],heatMap:["heatMap"]},P5e=["raster","3dtiles"],qz=(e,t)=>{if(P5e.includes(e)&&t.layer.type==="simple")return t.layer[e]},$z=new Zbe({max:1e4}),O5e=6e3;function G5e({layer:e,isHidden:t,sketchEditingFeature:n,...i}){const r=Vl(e),o=!r?.type||r.type==="auto"?Rm(r?.url):void 0;let s=r?.type&&L5e[o??r.type];(e.features?.length>O5e||r?.geojson?.useAsResource)&&(s=["resource"]);const a=Array.isArray(s)&&s.every(p=>l0[p][1].noFeature&&!l0[p][1].noLayer),c=!!e?.transition?.useTransition,l=!r?.updateInterval&&!c,u=R.useMemo(()=>r?.url?Ty(r.url):"",[r?.url]),{requestRender:h}=ai();R.useEffect(()=>{setTimeout(()=>{h?.()},300)}),R.useEffect(()=>()=>h?.(),[h]);const d=(p,m)=>{if(!M5e(p))return null;const y=!!i.viewerProperty?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,g=!!i.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps,v=e.layer.visible!==!1&&!t&&!(n?.layerId===e.id&&n?.feature?.id===m?.id),S=u+Ty(`${e.id}_${m?.id??""}_${p}_${v}_${y}_${g}_${JSON.stringify(m?.[p])??""}_${JSON.stringify(e.transition)??""}_${JSON.stringify(m?.geometry)??""}`);if(l){const T=$z.get(S);if(l&&T)return T}try{const[T,C]=l0[p]??[];if(!T||m&&!m[p]||C.noLayer&&!m||C.noFeature&&m||Array.isArray(s)&&!s.includes(p)||!Array.isArray(s)&&s!=="auto"||r?.type==="geojson"&&s==="auto"&&p==="resource")return null;const O=R.createElement(T,{...i,key:c?void 0:S,id:c?m?.id??e.id:S,property:m?m[p]:e[p]||qz(p,e),geometry:m?.geometry,feature:m,layer:e,isVisible:v});return l&&$z.set(S,O),O}catch(T){return console.error(`Error rendering component ${S}`,T),null}},f=R.useMemo(()=>!a||!s||!Array.isArray(s)?null:ce.jsx(ce.Fragment,{children:s.map(p=>{const[m]=l0[p]??[],y=e.layer.visible!==!1&&!t,g=!!i.viewerProperty?.scene?.imageBasedLighting?.sphericalHarmonicCoefficients,v=!!i.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps,S=e?.layer?.type==="simple"&&!!e?.layer?.["3dtiles"]?.sphericalHarmonicCoefficients,T=e?.layer?.type==="simple"&&!!e?.layer?.["3dtiles"]?.specularEnvironmentMaps,C=u+Ty(`${e?.id||""}_${p}_${y}_${g}_${v}_${S}}_${T}`);return R.createElement(m,{...i,key:C,id:`${e.id}_${p}`,property:qz(p,e)||e[p],layer:e,isVisible:y})})}),[a,s,e,t,u,i]);return ce.jsx(ce.Fragment,{children:f||[void 0,...e.features].flatMap(p=>Object.keys(l0).map(m=>d(m,p)))})}function V5e(){return window.REEARTH_E2E_ACCESS_TOKEN}function eN(e){e?window.REEARTH_E2E_CESIUM_VIEWER=e:delete window.REEARTH_E2E_CESIUM_VIEWER}const tN=1e6,nN=1e6;function F5e(e,t,n){const i=R.useMemo(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()||!n?.enabled||!n.targetArea?.lng||!n.targetArea.lat))return z5e(a,n.targetArea.lng,n.targetArea.lat)},[e,n?.enabled,n?.targetArea?.lng,n?.targetArea?.lat]),r=R.useMemo(()=>{if(!i)return;const a=typeof n?.targetWidth=="number"?n.targetWidth:tN,c=typeof n?.targetLength=="number"?n.targetLength:nN,{cartesianArray:l,cartographicDimensions:u}=iN(i,c/2,a/2);return{cartographicDimensions:u,cartesianArray:l}},[n?.targetWidth,n?.targetLength,i]),[o,s]=R.useState();return R.useEffect(()=>{const a=e.current?.cesiumElement;if(!a||a.isDestroyed()||!n?.targetArea||!i)return;const c=new M.Camera(a.scene);c.setView({destination:M.Cartesian3.fromDegrees(n.targetArea.lng,n.targetArea.lat,n.targetArea.height),orientation:{heading:n?.targetArea.heading,pitch:n?.targetArea.pitch,roll:n?.targetArea.roll,up:c.up}});const l=c.computeViewRectangle();if(!l)return;const u=M.Rectangle.computeWidth(l)*M.Math.PI*1e6,h=M.Rectangle.computeHeight(l)*M.Math.PI*1e6,{targetWidth:d=tN,targetLength:f=nN}=n??{},{cartesianArray:p}=iN(i,f/2+h,d/2+u);s(p)},[e,n,i]),R.useEffect(()=>{const a=e?.current?.cesiumElement,c=lo(e?.current?.cesiumElement);!a||a.isDestroyed()||!c||!n?.enabled||!r||a.camera.setView({destination:N5e(c,r),orientation:{heading:a.camera.heading,pitch:a.camera.pitch,roll:a.camera.roll,up:a.camera.up}})},[t,e,n,r]),{cameraViewBoundaries:r?.cartesianArray,cameraViewOuterBoundaries:o,cameraViewBoundariesMaterial:A5e}}const A5e=new M.PolylineDashMaterialProperty({color:M.Color.RED}),z5e=(e,t,n)=>{const i=e.scene.globe.ellipsoid,r=M.Cartesian3.fromDegrees(t,n,0),o=M.Cartographic.fromCartesian(r),s=i.geodeticSurfaceNormal(r),a=M.Cartesian3.normalize(M.Cartesian3.cross(M.Cartesian3.UNIT_Z,s,new M.Cartesian3),new M.Cartesian3),c=M.Cartesian3.normalize(M.Cartesian3.cross(s,a,new M.Cartesian3),new M.Cartesian3),l=new M.EllipsoidGeodesic(o,M.Cartographic.fromCartesian(c),i),u=new M.EllipsoidGeodesic(o,M.Cartographic.fromCartesian(a),i);return{vertical:l,horizontal:u}},iN=(e,t,n)=>{const i=e.vertical.interpolateUsingSurfaceDistance(t),r=e.vertical.interpolateUsingSurfaceDistance(-t),o=e.horizontal.interpolateUsingSurfaceDistance(n),s=e.horizontal.interpolateUsingSurfaceDistance(-n),a=new M.Cartographic(o.longitude,i.latitude,0),c=new M.Cartographic(s.longitude,i.latitude,0),l=new M.Cartographic(o.longitude,r.latitude,0),u=new M.Cartographic(s.longitude,r.latitude,0);return{cartographicDimensions:{rightDimension:o,leftDimension:s,topDimension:i,bottomDimension:r},cartesianArray:[M.Cartographic.toCartesian(a),M.Cartographic.toCartesian(c),M.Cartographic.toCartesian(u),M.Cartographic.toCartesian(l),M.Cartographic.toCartesian(a)]}},N5e=(e,t)=>{const n=M.Cartographic.fromDegrees(e?.lng,e?.lat,e?.height),i=new M.Cartographic(M.Math.clamp(n.longitude,t.cartographicDimensions.leftDimension.longitude,t.cartographicDimensions.rightDimension.longitude),M.Math.clamp(n.latitude,t.cartographicDimensions.bottomDimension.latitude,t.cartographicDimensions.topDimension.latitude),n.height);return M.Cartographic.toCartesian(i)},k5e=({cesium:e,property:t,camera:n,featureFlags:i,engineAPI:r,cameraForceHorizontalRoll:o=!1,onCameraChange:s})=>{const a=R.useRef([]),c=R.useCallback(()=>{const v=e?.current?.cesiumElement;if(!v||v.isDestroyed()||!s)return;const S=lo(v);S&&!vr(S,n)&&(a.current.push(S),a.current.length>10&&a.current.shift(),s?.(S))},[e,n,s]),l=R.useCallback(()=>{c()},[c]),u=R.useCallback(()=>{c()},[c]);R.useEffect(()=>{n&&!a.current.includes(n)&&(r.flyTo(n,{duration:0}),a.current=[])},[n,r]),R.useEffect(()=>{if(!e.current?.cesiumElement)return;const v=!!(i&Gn.CAMERA_MOVE),S=!!(i&Gn.CAMERA_ZOOM),T=!!(i&Gn.CAMERA_TILT),C=!!(i&Gn.CAMERA_LOOK);e.current.cesiumElement.scene.screenSpaceCameraController.enableTranslate=v,e.current.cesiumElement.scene.screenSpaceCameraController.enableRotate=v,e.current.cesiumElement.scene.screenSpaceCameraController.enableLook=C,e.current.cesiumElement.scene.screenSpaceCameraController.enableTilt=T,e.current.cesiumElement.scene.screenSpaceCameraController.enableZoom=S},[e,i]);const h=R.useRef(!1),d=E2e(()=>{h.current||(h.current=!0,t?.camera?.limiter?.enabled&&t?.camera?.limiter?.targetArea?r.flyTo(t?.camera?.limiter?.targetArea,{duration:0}):n&&r.flyTo(n,{duration:0}))},[r,t?.camera?.limiter?.enabled],(v,S)=>v[0]===S[0]&&v[1]===S[1]),f=R.useCallback(()=>{h.current=!1},[]),{cameraViewBoundaries:p,cameraViewOuterBoundaries:m,cameraViewBoundariesMaterial:y}=F5e(e,n,t?.camera?.limiter),g=R.useCallback(v=>{!v.camera||!o||Math.abs(M.Math.negativePiToPi(v.camera.roll))>Math.PI/86400&&v.camera.setView({orientation:{heading:v.camera.heading,pitch:v.camera.pitch,roll:0}})},[o]);return R.useEffect(()=>{const v=e.current?.cesiumElement;if(v)return v.scene.preRender.addEventListener(g)},[e,g]),{cameraViewBoundaries:p,cameraViewOuterBoundaries:m,cameraViewBoundariesMaterial:y,mountCamera:d,unmountCamera:f,handleCameraChange:l,handleCameraMoveEnd:u}},u0=new M.Color;function X5e(e){const t=e.width??1,n=e.height??1,i=this._context,r=i.readPixels({x:e.x,y:e.y,width:t,height:n,framebuffer:this._fb.framebuffer}),o=new Set;for(let s=0;s<r.length;s+=4)try{u0.red=M.Color.byteToFloat(r[s]),u0.green=M.Color.byteToFloat(r[s+1]),u0.blue=M.Color.byteToFloat(r[s+2]),u0.alpha=M.Color.byteToFloat(r[s+3]);const a=i.getObjectByPickColor(u0);a!=null&&o.add(a)}catch(a){console.error(a)}return Array.from(o.values())}const Z5e=new M.PerspectiveOffCenterFrustum,D5e=new M.Cartesian2;function U5e(e,t,n,i,r){const o=e.camera,s=o.frustum;Vn(s instanceof M.PerspectiveFrustum),Vn(s.fovy!==void 0),Vn(s.aspectRatio!==void 0);const a=s.near,c=Math.tan(s.fovy/2),l=s.aspectRatio*c,u=t.x,h=t.y,d=2*(u-r.x)/r.width-1,f=2*(r.height-h-r.y)/r.height-1,p=d*a*l,m=f*a*c,y=s.getPixelDimensions(r.width,r.height,a,PF(e),D5e),g=y.x*n/2,v=y.y*i/2,S=Z5e;return S.top=m+v,S.bottom=m-v,S.right=p+g,S.left=p-g,S.near=a,S.far=s.far,S.computeCullingVolume(o.positionWC,o.directionWC,o.upWC)}function W5e(e,t,n=new M.BoundingRectangle){Vn(e.width>=0&&e.height>=0),Vn(t.width>=0&&t.height>=0);const i=Math.max(e.x,t.x),r=Math.min(e.x+e.width,t.x+t.width),o=Math.max(e.y,t.y),s=Math.min(e.y+e.height,t.y+t.height);if(!(i>=r||o>=s))return n.x=i,n.y=o,n.width=r-i,n.height=s-o,n.clone(new M.BoundingRectangle)}const B5e=new Ume({pass:Ome.PICK}),Y5e=new M.Color(0,0,0,0),H5e=new M.Cartesian2,jl=new M.BoundingRectangle;function j5e(e,t,n,i){const r=e.groundPrimitives.show;e.groundPrimitives.show=!1,Vn(n>0&&i>0);const o=e.context,s=e.defaultView;e.view=s;const a=s.viewport;a.x=0,a.y=0,a.width=o.drawingBufferWidth,a.height=o.drawingBufferHeight,s.passState.viewport=M.BoundingRectangle.clone(a,s.passState.viewport),e.jobScheduler.disableThisFrame(),e.updateFrameState();const c=Vi.transformWindowToDrawingBuffer(e,t,H5e),l=PF(e),u=n*l,h=i*l,d=e.frameState;d.cullingVolume=U5e(e,c,u,h,a),d.invertClassification=!1,d.passes.pick=!0,d.tilesetPassState=B5e,o.uniformState.update(d),e.updateEnvironment(),jl.x=c.x-u/2,jl.y=e.drawingBufferHeight-c.y-h/2,jl.height=h,jl.width=u;const f=W5e(jl,s.viewport,jl);Vn(f!=null);const p=s.pickFramebuffer.begin(f,s.viewport);e.updateAndExecuteCommands(p,Y5e),e.resolveFramebuffers(p);const m=X5e.apply(s.pickFramebuffer,[jl]);return o.endFrame(),e.groundPrimitives.show=r,m}const K5e=(e,t,n,i,r)=>{const o=j5e(e.scene,t,n,i),s=[];for(const a of o){const[c,l]=Fx(e.clock.currentTime,a)??[],u=l?{...l,layerId:c}:void 0;!u||r&&!r(u)||s.push(u)}return s};function J5e(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function rN(e,t,n){n===void 0&&(n={});for(var i=0,r=e;i<r.length;i++){var o=r[i];if(o.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");for(var s=0;s<o[o.length-1].length;s++)if(o[o.length-1][s]!==o[0][s])throw new Error("First and last Position are not equivalent.")}var a={type:"Polygon",coordinates:e};return J5e(a,t,n)}function Q5e(e){var t=e%360;return t*Math.PI/180}function oN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function q5e(e){return!!e&&e.constructor===Object}var mr=63710088e-1,sN={centimeters:mr*100,centimetres:mr*100,degrees:mr/111325,feet:mr*3.28084,inches:mr*39.37,kilometers:mr/1e3,kilometres:mr/1e3,meters:mr,metres:mr,miles:mr/1609.344,millimeters:mr*1e3,millimetres:mr*1e3,nauticalmiles:mr/1852,radians:1,yards:mr*1.0936};function $5e(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function eLe(e,t,n){if(n===void 0&&(n={}),!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!cN(e[0])||!cN(e[1]))throw new Error("coordinates must contain numbers");var i={type:"Point",coordinates:e};return $5e(i,t,n)}function tLe(e,t){var n=sN[t];return e*n}function nLe(e,t){t===void 0&&(t="kilometers");var n=sN[t];if(!n)throw new Error(t+" units is invalid");return e/n}function aN(e){var t=e%360;return t*Math.PI/180}function iLe(e,t,n){if(t===void 0&&(t="kilometers"),!(e>=0))throw new Error("length must be a positive number");return tLe(nLe(e,t),n)}function cN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function rLe(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function tE(e,t,n,i){i===void 0&&(i={});var r=t<0,o=iLe(Math.abs(t),i.units,"meters");r&&(o=-Math.abs(o));var s=rLe(e),a=oLe(s,o,n);return a[0]+=a[0]-s[0]>180?-360:s[0]-a[0]>180?360:0,eLe(a,i.properties)}function oLe(e,t,n,i){i=i===void 0?mr:Number(i);var r=t/i,o=e[0]*Math.PI/180,s=aN(e[1]),a=aN(n),c=r*Math.cos(a),l=s+c;Math.abs(l)>Math.PI/2&&(l=l>0?Math.PI-l:-Math.PI-l);var u=Math.log(Math.tan(l/2+Math.PI/4)/Math.tan(s/2+Math.PI/4)),h=Math.abs(u)>1e-11?c/u:Math.cos(s),d=r*Math.sin(a)/h,f=o+d;return[(f*180/Math.PI+540)%360-180,l*180/Math.PI]}function sLe(e,t,n){n===void 0&&(n={});var i={type:"Feature"};return(n.id===0||n.id)&&(i.id=n.id),n.bbox&&(i.bbox=n.bbox),i.properties=t||{},i.geometry=e,i}function aLe(e,t,n){if(n===void 0&&(n={}),!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!lN(e[0])||!lN(e[1]))throw new Error("coordinates must contain numbers");var i={type:"Point",coordinates:e};return sLe(i,t,n)}function lN(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function cLe(e){return!!e&&e.constructor===Object}function nE(e,t,n){if(e!==null)for(var i,r,o,s,a,c,l,u=0,h=0,d,f=e.type,p=f==="FeatureCollection",m=f==="Feature",y=p?e.features.length:1,g=0;g<y;g++){l=p?e.features[g].geometry:m?e.geometry:e,d=l?l.type==="GeometryCollection":!1,a=d?l.geometries.length:1;for(var v=0;v<a;v++){var S=0,T=0;if(s=d?l.geometries[v]:l,s!==null){c=s.coordinates;var C=s.type;switch(u=n&&(C==="Polygon"||C==="MultiPolygon")?1:0,C){case null:break;case"Point":if(t(c,h,g,S,T)===!1)return!1;h++,S++;break;case"LineString":case"MultiPoint":for(i=0;i<c.length;i++){if(t(c[i],h,g,S,T)===!1)return!1;h++,C==="MultiPoint"&&S++}C==="LineString"&&S++;break;case"Polygon":case"MultiLineString":for(i=0;i<c.length;i++){for(r=0;r<c[i].length-u;r++){if(t(c[i][r],h,g,S,T)===!1)return!1;h++}C==="MultiLineString"&&S++,C==="Polygon"&&T++}C==="Polygon"&&S++;break;case"MultiPolygon":for(i=0;i<c.length;i++){for(T=0,r=0;r<c[i].length;r++){for(o=0;o<c[i][r].length-u;o++){if(t(c[i][r][o],h,g,S,T)===!1)return!1;h++}T++}S++}break;case"GeometryCollection":for(i=0;i<s.geometries.length;i++)if(nE(s.geometries[i],t,n)===!1)return!1;break;default:throw new Error("Unknown Geometry Type")}}}}}function lLe(e,t){t===void 0&&(t={});var n=0,i=0,r=0;return nE(e,function(o){n+=o[0],i+=o[1],r++},!0),aLe([n/r,i/r],t.properties)}function uLe(e){var t=e%(2*Math.PI);return t*180/Math.PI}function iE(e){var t=e%360;return t*Math.PI/180}function Pb(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function hLe(e,t,n){n===void 0&&(n={});var i;n.final?i=uN(Pb(t),Pb(e)):i=uN(Pb(e),Pb(t));var r=i>180?-(360-i):i;return r}function uN(e,t){var n=iE(e[1]),i=iE(t[1]),r=iE(t[0]-e[0]);r>Math.PI&&(r-=2*Math.PI),r<-Math.PI&&(r+=2*Math.PI);var o=Math.log(Math.tan(i/2+Math.PI/4)/Math.tan(n/2+Math.PI/4)),s=Math.atan2(r,o);return(uLe(s)+360)%360}var gr=63710088e-1,hN={centimeters:gr*100,centimetres:gr*100,degrees:gr/111325,feet:gr*3.28084,inches:gr*39.37,kilometers:gr/1e3,kilometres:gr/1e3,meters:gr,metres:gr,miles:gr/1609.344,millimeters:gr*1e3,millimetres:gr*1e3,nauticalmiles:gr/1852,radians:1,yards:gr*1.0936};function dLe(e,t){t===void 0&&(t="kilometers");var n=hN[t];if(!n)throw new Error(t+" units is invalid");return e*n}function fLe(e,t){var n=hN[t];return e/n}function pLe(e,t,n){if(n===void 0&&(n="kilometers"),!(e>=0))throw new Error("length must be a positive number");return dLe(fLe(e,t),n)}function dN(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function mLe(e,t,n){n===void 0&&(n={});var i=dN(e),r=dN(t);r[0]+=r[0]-i[0]>180?-360:i[0]-r[0]>180?360:0;var o=gLe(i,r),s=pLe(o,"meters",n.units);return s}function gLe(e,t,n){n=n===void 0?gr:Number(n);var i=n,r=e[1]*Math.PI/180,o=t[1]*Math.PI/180,s=o-r,a=Math.abs(t[0]-e[0])*Math.PI/180;a>Math.PI&&(a-=2*Math.PI);var c=Math.log(Math.tan(o/2+Math.PI/4)/Math.tan(r/2+Math.PI/4)),l=Math.abs(c)>1e-11?s/c:Math.cos(r),u=Math.sqrt(s*s+l*l*a*a),h=u*i;return h}function yLe(e){if(!e)throw new Error("geojson is required");switch(e.type){case"Feature":return fN(e);case"FeatureCollection":return bLe(e);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return rE(e);default:throw new Error("unknown GeoJSON type")}}function fN(e){var t={type:"Feature"};return Object.keys(e).forEach(function(n){switch(n){case"type":case"properties":case"geometry":return;default:t[n]=e[n]}}),t.properties=pN(e.properties),t.geometry=rE(e.geometry),t}function pN(e){var t={};return e&&Object.keys(e).forEach(function(n){var i=e[n];typeof i=="object"?i===null?t[n]=null:Array.isArray(i)?t[n]=i.map(function(r){return r}):t[n]=pN(i):t[n]=i}),t}function bLe(e){var t={type:"FeatureCollection"};return Object.keys(e).forEach(function(n){switch(n){case"type":case"features":return;default:t[n]=e[n]}}),t.features=e.features.map(function(n){return fN(n)}),t}function rE(e){var t={type:e.type};return e.bbox&&(t.bbox=e.bbox),e.type==="GeometryCollection"?(t.geometries=e.geometries.map(function(n){return rE(n)}),t):(t.coordinates=mN(e.coordinates),t)}function mN(e){var t=e;return typeof t[0]!="object"?t.slice():t.map(function(n){return mN(n)})}function _Le(e){if(Array.isArray(e))return e;if(e.type==="Feature"){if(e.geometry!==null)return e.geometry.coordinates}else if(e.coordinates)return e.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function vLe(e,t,n){if(n=n||{},!cLe(n))throw new Error("options is invalid");var i=n.pivot,r=n.mutate;if(!e)throw new Error("geojson is required");if(t==null||isNaN(t))throw new Error("angle is required");return t===0||(i||(i=lLe(e)),(r===!1||r===void 0)&&(e=yLe(e)),nE(e,function(o){var s=hLe(i,o),a=s+t,c=mLe(i,o),l=_Le(tE(i,c,a));o[0]=l[0],o[1]=l[1]})),e}function oE(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return e.geometry.coordinates;if(e.type==="Point")return e.coordinates}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return e;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function wLe(e,t,n,i){i=i||{};var r=i.steps||64,o=i.units||"kilometers",s=i.angle||0,a=i.pivot||e,c=i.properties||e.properties||{};if(!e)throw new Error("center is required");if(!t)throw new Error("xSemiAxis is required");if(!n)throw new Error("ySemiAxis is required");if(!q5e(i))throw new Error("options must be an object");if(!oN(r))throw new Error("steps must be a number");if(!oN(s))throw new Error("angle must be a number");var l=oE(e);if(o==="degrees")var u=Q5e(s);else t=tE(e,t,90,{units:o}),n=tE(e,n,0,{units:o}),t=oE(t)[0]-l[0],n=oE(n)[1]-l[1];for(var h=[],d=0;d<r;d+=1){var f=d*-360/r,p=t*n/Math.sqrt(Math.pow(n,2)+Math.pow(t,2)*Math.pow(gN(f),2)),m=t*n/Math.sqrt(Math.pow(t,2)+Math.pow(n,2)/Math.pow(gN(f),2));if(f<-90&&f>=-270&&(p=-p),f<-180&&f>=-360&&(m=-m),o==="degrees"){var y=p*Math.cos(u)+m*Math.sin(u),g=m*Math.cos(u)-p*Math.sin(u);p=y,m=g}h.push([p+l[0],m+l[1]])}return h.push(h[0]),o==="degrees"?rN([h],c):vLe(rN([h],c),s,{pivot:a})}function gN(e){var t=e*Math.PI/180;return Math.tan(t)}const Kl=new Te,Ob=new b,sE=new b;function xLe(e,t){if(e.length===1)try{const n=Te.fromCartesian(e[0],t,Kl);return kR([U.toDegrees(n.longitude),U.toDegrees(n.latitude)]).geometry}catch(n){console.error(n)}}function SLe(e,t){if(e.length!==2)return;const n=b.distance(e[0],e[1]);if(n!==0)try{const i=Te.fromCartesian(e[0],t,Kl);return wLe([U.toDegrees(i.longitude),U.toDegrees(i.latitude)],n,n,{units:"meters"}).geometry}catch(i){console.error(i)}}function ELe(e,t){if(!(e.length!==2&&e.length!==3))try{if(e.length===2)return n_(e.map(h=>{const d=Te.fromCartesian(h,t,Kl);return[U.toDegrees(d.longitude),U.toDegrees(d.latitude)]})).geometry;const[n,i,r]=e,o=b.projectVector(b.subtract(r,n,Ob),b.subtract(i,n,sE),Ob),s=b.subtract(r,b.add(n,o,Ob),sE),a=b.add(n,s,Ob),c=b.add(i,s,sE);return sl([[n,i,c,a,n].map(u=>{const h=Te.fromCartesian(u,t,Kl);return[U.toDegrees(h.longitude),U.toDegrees(h.latitude)]})]).geometry}catch(n){console.error(n)}}function TLe(e,t){if(!(e.length<2))try{return n_(e.map(i=>{const r=Te.fromCartesian(i,t,Kl);return[U.toDegrees(r.longitude),U.toDegrees(r.latitude)]})).geometry}catch(n){console.error(n)}}function CLe(e,t){if(!(e.length<2))try{return e.length===2?n_(e.map(r=>{const o=Te.fromCartesian(r,t,Kl);return[U.toDegrees(o.longitude),U.toDegrees(o.latitude)]})).geometry:sl([[...e,e[0]].map(i=>{const r=Te.fromCartesian(i,t,Kl);return[U.toDegrees(r.longitude),U.toDegrees(r.latitude)]})]).geometry}catch(n){console.error(n)}}function yN({type:e,controlPoints:t}){switch(e){case"marker":return xLe(t);case"polyline":return TLe(t);case"circle":case"extrudedCircle":return SLe(t);case"rectangle":case"extrudedRectangle":return ELe(t);case"polygon":case"extrudedPolygon":return CLe(t);default:return}}function RLe(e,t){const n=R.useRef(void 0),i=R.useRef({click:[],doubleClick:[],mouseDown:[],mouseUp:[],rightClick:[],rightDown:[],rightUp:[],middleClick:[],middleDown:[],middleUp:[],mouseMove:[],mouseEnter:[],mouseLeave:[],wheel:[]}),r=R.useRef([]),o=R.useMemo(()=>({name:"cesium",requestRender:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||s.scene?.requestRender()},getCamera:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return lo(s)},getLocationFromScreen:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return Yv(l.scene,s,a,c)},getCameraFovInfo:({withTerrain:s,calcViewSize:a})=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))try{let l,u,h;return s&&(u=joe(c.scene),u&&(l=v5(u,c.scene))),l||(u=new Ze.Cartesian3,_5(c.scene,u),l=v5(u,c.scene)),a&&u&&c.scene.camera.frustum instanceof Ze.PerspectiveFrustum&&c.scene.camera.frustum.fov!==void 0&&(h=Ze.Cartesian3.distance(c.scene.camera.positionWC,u)*Math.tan(c.scene.camera.frustum.fov/2)),{center:l,viewSize:h}}catch{return}},sampleTerrainHeight:async(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return await Bu(c.scene,s,a)},computeGlobeHeight:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return l.scene.globe.getHeight(Ze.Cartographic.fromDegrees(s,a,c))},getGlobeHeight:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed())return;const a=s.scene,{globeHeight:c}=a;if(!(!a||c==null))return c},toXYZ:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!u||u.isDestroyed())return;const h=Ze.Cartesian3.fromDegrees(s,a,c,l?.useGlobeEllipsoid?u.scene.globe.ellipsoid:void 0);return[h.x,h.y,h.z]},toLngLatHeight:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!u||u.isDestroyed())return;const h=Ze.Cartographic.fromCartesian(Ze.Cartesian3.fromElements(s,a,c),l?.useGlobeEllipsoid?u.scene.globe.ellipsoid:void 0);return[M.Math.toDegrees(h.longitude),M.Math.toDegrees(h.latitude),h.height]},toWindowPosition:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Ze.SceneTransforms.worldToWindowCoordinates(a.scene,Ze.Cartesian3.fromElements(...s));if(c)return[c.x,c.y]},convertScreenToPositionOffset:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Ze.Cartesian3.fromElements(...s),u=new Ze.Cartesian3,h=new Ze.Cartographic,d=new Ze.Cartesian3,f=new Ze.Ellipsoid,p=new Ze.Ray,m=new Ze.Cartesian3,y=c.scene,g=y.globe.ellipsoid;let v;try{v=Ze.Cartographic.fromCartesian(l,g,h)}catch{return}d.x=g.radii.x+v.height,d.y=g.radii.y+v.height,d.z=g.radii.z+v.height;const S=Ze.Ellipsoid.fromCartesian3(d,f),T=new Ze.Cartesian2;try{[T.x,T.y]=o.toWindowPosition(s)??[0,0]}catch{return}T.x+=a[0],T.y+=a[1];const C=y.camera.getPickRay(T,p);if(C==null)return;const O=Ze.IntersectionTests.rayEllipsoid(C,S);if(O==null)return;const V=Ze.Ray.getPoint(C,O.start,m),A=Ze.Cartesian3.subtract(V,l,u);return[A.x,A.y,A.z]},isPositionVisible:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return!1;const c=new rs(Ze.Ellipsoid.WGS84,Ze.Cartesian3.ZERO);return c.cameraPosition=a.scene.camera.position,c.isPointVisible(Ze.Cartesian3.fromElements(...s))},setView:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed()||s.lat===void 0||s.lng===void 0||s.height===void 0)return!1;const c=a.scene;if(s.lng||s.lat||s.height){const l=Ze.Cartesian3.fromDegrees(s.lng,s.lat,s.height);c.camera.position.x=l.x,c.camera.position.y=l.y,c.camera.position.z=l.z}(s.heading||s.pitch)&&c.camera.setView({orientation:{heading:s.heading,pitch:s.pitch}}),s.fov&&c.camera.frustum instanceof Ze.PerspectiveFrustum&&(c.camera.frustum.fov=s.fov)},getExtrudedHeight:(s,a,c)=>{const l=t.current?.cesiumElement;if(!(!l||l.isDestroyed()))return gse(l.scene,new Ze.Cartesian3(s[0],s[1],s[2]),new Ze.Cartesian2(a[0],a[1]),c)},getExtrudedPoint:(s,a)=>{if(!s||!a)return;const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=new Ze.Cartesian3(s[0],s[1],s[2]),u=new Ze.Cartesian3,h=c.scene?.globe.ellipsoid.geodeticSurfaceNormal(l,u);if(!h)return;const d=Ze.Cartesian3.add(l,Ze.Cartesian3.multiplyByScalar(h,a,u),u);return[d.x,d.y,d.z]},getSurfaceDistance:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=c.scene,u=new Ze.EllipsoidGeodesic(void 0,void 0,l.globe.ellipsoid);return u.setEndPoints(Ze.Cartographic.fromCartesian(s,l.globe.ellipsoid,new Ze.Cartographic),Ze.Cartographic.fromCartesian(a,l.globe.ellipsoid,new Ze.Cartographic)),u.surfaceDistance},equalsEpsilon2d:(s,a,c=0,l=0)=>Ze.Cartesian2.equalsEpsilon(new Ze.Cartesian2(s[0],s[1]),new Ze.Cartesian2(a[0],a[1]),c,l),equalsEpsilon3d:(s,a,c=0,l=0)=>Ze.Cartesian3.equalsEpsilon(new Ze.Cartesian3(s[0],s[1],s[2]),new Ze.Cartesian3(a[0],a[1],a[2]),c,l),createGeometry:({type:s,controlPoints:a})=>yN({type:s,controlPoints:a.map(c=>new Ze.Cartesian3(...c))}),setCursor:s=>{const a=t.current?.cesiumElement;if(!(!a||a.isDestroyed()))return a.canvas.style.cursor=s??"auto",null},flyTo:(s,a)=>{if(s&&typeof s=="object"){const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;n.current?.(),n.current=Hv(c.scene?.camera,{...lo(c),...s},a)}if(s&&typeof s=="string"){const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=s,u=Us(c,l,l,!0),h=Tt(u);if(u instanceof Ze.Primitive){c.scene.camera.flyToBoundingSphere(Ze.BoundingSphere.fromTransformation(u.modelMatrix));return}if(u instanceof Ze.GroundPrimitive){c.scene.camera.flyToBoundingSphere(h?.originalProperties);return}if(u&&!(u instanceof Ze.Cesium3DTileFeature||u instanceof Ze.Cesium3DTilePointFeature||u instanceof Ze.Model||u instanceof Ze.Primitive||u instanceof Ze.GroundPrimitive))c.flyTo(u,a);else{for(const p of[c.dataSourceDisplay.dataSources,c.dataSources])for(let m=0;m<p.length;m++){const y=p.get(m);if(y.entities.values.find(S=>Tt(S)?.layerId===l)){c.flyTo(y,a);return}}const d=[];for(const p of c.entities.values)Tt(p)?.layerId===l&&d.push(p);if(d.length){c.flyTo(d,a);return}const f=Us(c,l);if(f instanceof Ze.Primitive){c.scene.camera.flyToBoundingSphere(Ze.BoundingSphere.fromTransformation(f.modelMatrix));return}f&&!(f instanceof Ze.Cesium3DTileFeature||f instanceof Ze.Cesium3DTilePointFeature||f instanceof Ze.Model||f instanceof Ze.Primitive||f instanceof Ze.GroundPrimitive)&&c.flyTo(f,a)}}},flyToBBox:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;n.current?.();const l=Ze.BoundingSphere.fromRectangle3D(Ze.Rectangle.fromDegrees(...s)),u=c.scene.camera;c.camera.flyToBoundingSphere(l,{offset:{heading:a?.heading?M.Math.toDegrees(a.heading):c.scene.camera.heading,pitch:a?.pitch?M.Math.toDegrees(a.pitch):u.pitch,range:a?.range??0},duration:a?.duration}),n.current=()=>{u?.cancelFlight()}},rotateOnCenter:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=_5(c,new Ze.Cartesian3);l&&c.camera.rotate(l,s)},overrideScreenSpaceController:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene?.screenSpaceCameraController,l=ese(s);Object.assign(c,l)},lookAt:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed())){if(a?.withoutAnimation)return Joe(c.scene,{...lo(c),...s});n.current?.(),n.current=Koe(c.scene?.camera,{...lo(c),...s},a)}},lookAtLayer:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.entities.getById(s);if(!c)return;const l=c.position?.getValue(a.clock.currentTime);if(!l)return;const u=a.camera.positionWC,h=Ze.Cartesian3.distance(l,u);if(Math.round(h*1e3)/1e3===5e3)return;const d=lo(a),f=new Ze.HeadingPitchRange(d?.heading??0,d?.pitch??-90,5e3);a.zoomTo(c,f)},getViewport:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed())return;const a=s.camera.computeViewRectangle();return a?{north:M.Math.toDegrees(a.north),south:M.Math.toDegrees(a.south),west:M.Math.toDegrees(a.west),east:M.Math.toDegrees(a.east)}:void 0},zoomIn:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||S5({viewer:c,relativeAmount:1/s},a)},zoomOut:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||S5({viewer:c,relativeAmount:s},a)},orbit:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=c.camera,u=.02,h=s+M.Math.PI_OVER_TWO,d=Math.cos(h)*u,f=Math.sin(h)*u,p=Ze.Matrix4.clone(l.transform),m=x5({camera:l,scene:c});if(m||l.positionWC){const y=Ze.Transforms.eastNorthUpToFixedFrame(m||l.positionWC,c.globe.ellipsoid);l.lookAtTransform(y)}a.scene.mode!==Ze.SceneMode.SCENE3D?l.move(new Ze.Cartesian3(d,f,0),Math.max(c.canvas.clientWidth,c.canvas.clientHeight)/100*l.positionCartographic.height*u):m?(l.rotateLeft(d),l.rotateUp(f)):(l.look(Ze.Cartesian3.UNIT_Z,d),l.look(l.right,f)),l.lookAtTransform(p)},rotateRight:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=a.scene,l=c.camera,u=Ze.Matrix4.clone(l.transform),h=Ze.Transforms.eastNorthUpToFixedFrame(l.positionWC,c.globe.ellipsoid);a.scene.mode!==Ze.SceneMode.SCENE3D?(l.twistRight(s- -l.heading),l.twistLeft(s- -l.heading)):(l.lookAtTransform(h),l.rotateRight(s- -l.heading),l.lookAtTransform(u))},changeSceneMode:(s,a=2)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()||!c.scene))switch(s){case"2d":c?.scene?.morphTo2D(a);break;case"columbus":c?.scene?.morphToColumbusView(a);break;default:c?.scene?.morphTo3D(a);break}},getClock:()=>{const s=t.current?.cesiumElement;if(!s||s.isDestroyed()||!s.clock)return;const a=s.clock;return Qoe(a)},captureScreen:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return c.scene.requestRender(),c.render(),c.canvas.toDataURL(s,a)},enableScreenSpaceCameraController:(s=!0)=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed()||!a.scene)return;const c=!!s;a.scene.screenSpaceCameraController.enableRotate=c,a.scene.screenSpaceCameraController.enableTranslate=c,a.scene.screenSpaceCameraController.enableZoom=c,a.scene.screenSpaceCameraController.enableTilt=c,a.scene.screenSpaceCameraController.enableLook=c},lookHorizontal:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||rse(a.scene,s)},lookVertical:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||ose(a.scene,s)},moveForward:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||sse(a.scene,s)},moveBackward:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||ase(a.scene,s)},moveUp:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||cse(a.scene,s)},moveDown:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||lse(a.scene,s)},moveLeft:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||use(a.scene,s)},moveRight:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||!a.scene||!s||hse(a.scene,s)},moveOverTerrain:async s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||dse(a,s)},flyToGround:async(s,a,c)=>{const l=t.current?.cesiumElement;!l||l.isDestroyed()||fse(l,n,s,a,c)},onClick:s=>{i.current.click.push(s)},onDoubleClick:s=>{i.current.doubleClick.push(s)},onMouseDown:s=>{i.current.mouseDown.push(s)},onMouseUp:s=>{i.current.mouseUp.push(s)},onRightClick:s=>{i.current.rightClick.push(s)},onRightDown:s=>{i.current.rightDown.push(s)},onRightUp:s=>{i.current.rightUp.push(s)},onMiddleClick:s=>{i.current.middleClick.push(s)},onMiddleDown:s=>{i.current.middleDown.push(s)},onMiddleUp:s=>{i.current.middleUp.push(s)},onMouseMove:s=>{i.current.mouseMove.push(s)},onMouseEnter:s=>{i.current.mouseEnter.push(s)},onMouseLeave:s=>{i.current.mouseLeave.push(s)},onWheel:s=>{i.current.wheel.push(s)},mouseEventCallbacks:i.current,changeSpeed:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.multiplier=s,a.clock.clockStep=M.ClockStep.SYSTEM_CLOCK_MULTIPLIER)},changeTime:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.currentTime=M.JulianDate.fromDate(s))},pause:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||(s.clock.shouldAnimate=!1)},play:()=>{const s=t.current?.cesiumElement;!s||s.isDestroyed()||(s.clock.shouldAnimate=!0)},tick:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return M.JulianDate.toDate(s.clock.tick())},changeStart:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.startTime=M.JulianDate.fromDate(s))},changeStop:s=>{const a=t.current?.cesiumElement;!a||a.isDestroyed()||(a.clock.stopTime=M.JulianDate.fromDate(s))},inViewport:s=>{const a=o.getViewport();return!!(a&&s&&typeof s.lng=="number"&&typeof s.lat=="number"&&Ze.Rectangle.contains(new Ze.Rectangle(M.Math.toRadians(a.west),M.Math.toRadians(a.south),M.Math.toRadians(a.east),M.Math.toRadians(a.north)),Ze.Cartographic.fromDegrees(s.lng,s.lat)))},findFeatureById:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Us(c,s,a),u=Tt(l);if(u?.featureId){if(l instanceof Ze.Entity)return{type:"feature",id:u.featureId,properties:Rh(c.clock.currentTime,l),metaData:{description:Ih(c.clock.currentTime,l)}};if(l instanceof Ze.Cesium3DTileFeature||l instanceof Ze.Cesium3DTilePointFeature)return{type:"feature",id:u.featureId,properties:Mp(l)}}},findFeaturesByIds:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return Cy(c,s,a,l=>{const u=Fx(c.clock.currentTime,l)?.[1];return u?{...u,type:"feature"}:void 0})},findComputedFeatureById:(s,a)=>{const c=t.current?.cesiumElement;if(!c||c.isDestroyed())return;const l=Us(c,s,a),u=Tt(l);if(u?.featureId){if(l instanceof Ze.Entity)return u.computedFeature??{type:"computedFeature",id:u.featureId,geometry:Mb(c.clock.currentTime,l),properties:Rh(c.clock.currentTime,l),metaData:{description:Ih(c.clock.currentTime,l)}};if(l instanceof Ze.Cesium3DTileFeature||l instanceof Ze.Cesium3DTilePointFeature)return u.computedFeature??{type:"computedFeature",id:u.featureId,properties:Mp(l)}}},findComputedFeaturesByIds:(s,a)=>{const c=t.current?.cesiumElement;if(!(!c||c.isDestroyed()))return Cy(c,s,a,l=>Fx(c.clock.currentTime,l)?.[1])},bringToFront:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Us(a,s);c&&"bringToFront"in c&&typeof c.bringToFront=="function"&&c.bringToFront()},sendToBack:s=>{const a=t.current?.cesiumElement;if(!a||a.isDestroyed())return;const c=Us(a,s);c&&"sendToBack"in c&&typeof c.sendToBack=="function"&&c.sendToBack()},selectFeatures:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||Cy(c,s,a,(l,u)=>{u&&"onSelectFeature"in u&&typeof u.onSelectFeature=="function"&&u.onSelectFeature(l);const d={...Tt(l)??{},isFeatureSelected:!0};return xo(l,d),l})},unselectFeatures:(s,a)=>{const c=t.current?.cesiumElement;!c||c.isDestroyed()||Cy(c,s,a,(l,u)=>{u&&"onUnselectFeature"in u&&typeof u.onUnselectFeature=="function"&&u.onUnselectFeature(l);const h=Tt(l)??{};return h.isFeatureSelected=!1,xo(l,h),l})},pickManyFromViewport:(s,a,c,l)=>{const u=t.current?.cesiumElement;if(!(!u||u.isDestroyed()))return K5e(u,new Ze.Cartesian2(s[0],s[1]),a,c,l)},onTick:s=>{r.current.push(s)},removeTickEventListener:s=>{r.current=r.current.filter(a=>a!==s)||[]},tickEventCallback:r,calcRectangleControlPoint:(s,a,c)=>{const l=new Ze.Cartesian3(...s),u=new Ze.Cartesian3(...a),h=new Ze.Cartesian3(...c),d=new Ze.Cartesian3,f=new Ze.Cartesian3,p=Ze.Cartesian3.projectVector(Ze.Cartesian3.subtract(h,l,d),Ze.Cartesian3.subtract(u,l,f),d),m=Ze.Cartesian3.subtract(h,Ze.Cartesian3.add(l,p,d),f),y=Ze.Cartesian3.midpoint(l,u,d),g=Ze.Cartesian3.add(y,m,f),v=[g.x,g.y,g.z];return[s,a,v]},getCredits:()=>{const s=t.current?.cesiumElement;if(!(!s||s.isDestroyed()))return C5(s)}}),[t]);return R.useImperativeHandle(e,()=>o,[o]),o}const ILe=({cesium:e,requestingRenderMode:t,isLayerDragging:n,shouldRender:i,property:r})=>{const o=R.useCallback(()=>{const a=e.current?.cesiumElement;!t?.current||!a||a.isDestroyed()||(a.scene.requestRender(),t.current===md&&(t.current=b1))},[e,t]),s=R.useRef(void 0);R.useEffect(()=>{s.current=o},[o]),R.useEffect(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()))return a.scene.postUpdate.addEventListener(()=>{s.current?.()})},[e]),R.useEffect(()=>{t&&(t.current=md)},[r,t]),R.useEffect(()=>{const a=e.current?.cesiumElement;!a||a.isDestroyed()||t&&(t.current=n||i?pC:t.current===md?md:b1)},[e,n,i,t])};var MLe=Object.defineProperty,LLe=Object.defineProperties,PLe=Object.getOwnPropertyDescriptors,bN=Object.getOwnPropertySymbols,OLe=Object.prototype.hasOwnProperty,GLe=Object.prototype.propertyIsEnumerable,_N=(e,t,n)=>t in e?MLe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,VLe=(e,t)=>{for(var n in t||(t={}))OLe.call(t,n)&&_N(e,n,t[n]);if(bN)for(var n of bN(t))GLe.call(t,n)&&_N(e,n,t[n]);return e},FLe=(e,t)=>LLe(e,PLe(t));class aE{constructor(t,n){this._initialEnableRotate=!0,this._initialEnableTranslate=!0,this._callbackProperty=new M.CallbackProperty(()=>{var i;return(i=this._position)!=null?i:this._initialPosition},!1),this.cancelDragging=()=>{clearTimeout(this._timeout),this._entity&&(this._entity.position=this._initialPosition),this._entity=void 0,this._initialPosition=void 0,this._initialScreenPosition=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging)},this._handleDrag=i=>{var r;if(this._entity||this.viewer.isDestroyed()||!i?.position)return;const o=this._pick(i.position);if(!o)return;const s=()=>{var a,c,l;if(this._entity||this.viewer.isDestroyed())return;this._timeout=void 0,this._initialPosition=o.position,this._initialScreenPosition=i.position.clone();const u=(a=o.position)==null?void 0:a.getValue(this.viewer.clock.currentTime);if(u){const f=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(u).height;this._ellipsoid=aE.enlargeEllipsoid(this.viewer.scene.globe.ellipsoid,f),this.viewer.scene.mode===M.SceneMode.SCENE2D||this.viewer.scene.mode===M.SceneMode.COLUMBUS_VIEW?this._initialHeight=f:this._initialHeight=void 0}const h=this._resetHeight(this._convertCartesian2ToPosition(i.position)),d=this._context(h,i.position);if(d&&((l=(c=this.options)==null?void 0:c.onDrag)==null?void 0:l.call(c,o,h,d))===!1){this._initialPosition=void 0,this._initialScreenPosition=void 0,this._ellipsoid=void 0;return}this._position=h,this._entity=o,this._initialEnableRotate=this.viewer.scene.screenSpaceCameraController.enableRotate,this._initialEnableTranslate=this.viewer.scene.screenSpaceCameraController.enableTranslate,this.viewer.scene.mode===M.SceneMode.SCENE3D?this.viewer.scene.screenSpaceCameraController.enableRotate=!1:this.viewer.scene.screenSpaceCameraController.enableTranslate=!1,this.viewer.canvas.addEventListener("blur",this.cancelDragging),o.position=this._callbackProperty};if(window.clearTimeout(this._timeout),typeof((r=this.options)==null?void 0:r.dragDelay)>"u"){s();return}this._timeout=window.setTimeout(s,this.options.dragDelay)},this._handleDragging=i=>{var r,o;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!i?.endPosition)return;const s=this._resetHeight(this._convertCartesian2ToPosition(i.endPosition)),a=this._context(s,i.endPosition);if(!a)return;const c=(o=(r=this.options)==null?void 0:r.onDragging)==null?void 0:o.call(r,this._entity,s,FLe(VLe({},a),{previousScreenPosition:i.startPosition}));c!==!1&&(typeof c<"u"?this._position=c:s&&(this._position=s))},this._handleDrop=i=>{var r,o;if(clearTimeout(this._timeout),!this._entity||this.viewer.isDestroyed()||!i?.position)return;const s=this._entity;s.position=this._initialPosition,this._position=void 0,this._entity=void 0,this._timeout=void 0,this.viewer.scene.screenSpaceCameraController.enableRotate=this._initialEnableRotate,this.viewer.scene.screenSpaceCameraController.enableTranslate=this._initialEnableTranslate,this.viewer.canvas.removeEventListener("blur",this.cancelDragging);const a=this._resetHeight(this._convertCartesian2ToPosition(i.position)),c=this._context(a,i.position);this._initialPosition=void 0,this._initialScreenPosition=void 0,this._initialHeight=void 0,this._ellipsoid=void 0,c&&((o=(r=this.options)==null?void 0:r.onDrop)==null?void 0:o.call(r,s,a,c))!==!1&&a&&(s.position=a)},this.viewer=t,this.options=n,n?.initialDisabled||this.enable()}get isDragging(){return!!this._entity}enable(){var t,n,i,r,o,s;this._handler=new M.ScreenSpaceEventHandler(this.viewer.canvas),this._handler.setInputAction(this._handleDrag,(n=(t=this.options)==null?void 0:t.dragInputType)!=null?n:M.ScreenSpaceEventType.LEFT_DOWN),this._handler.setInputAction(this._handleDragging,(r=(i=this.options)==null?void 0:i.draggingInputType)!=null?r:M.ScreenSpaceEventType.MOUSE_MOVE),this._handler.setInputAction(this._handleDrop,(s=(o=this.options)==null?void 0:o.dropInputType)!=null?s:M.ScreenSpaceEventType.LEFT_UP)}disable(){var t;this.cancelDragging(),(t=this._handler)==null||t.destroy(),this._handler=void 0}get isActive(){return!!this._handler}_pick(t){var n;return(n=this.viewer.scene.pick(t))==null?void 0:n.id}_context(t,n){if(this._initialScreenPosition)return{position:t,screenPosition:n,initialPosition:this._initialPosition,initialScreenPosition:this._initialScreenPosition}}_convertCartesian2ToPosition(t){var n;return this.viewer.scene.camera.pickEllipsoid(t,(n=this._ellipsoid)!=null?n:this.viewer.scene.globe.ellipsoid)}_resetHeight(t){if(t&&(this.viewer.scene.mode===M.SceneMode.SCENE2D||this.viewer.scene.mode===M.SceneMode.COLUMBUS_VIEW)&&this._initialHeight){const n=this.viewer.scene.globe.ellipsoid.cartesianToCartographic(t);return M.Cartesian3.fromRadians(n.longitude,n.latitude,this._initialHeight)}return t}static enlargeEllipsoid(t,n){return new M.Ellipsoid(t.radii.x+n,t.radii.y+n,t.radii.z+n)}}const ALe=({cesium:e,isLayerDraggable:t,onLayerDrag:n,onLayerDrop:i})=>{const r=R.useCallback((a,c,l)=>{const u=e.current?.cesiumElement;if(!u||u.isDestroyed()||!E5(a)||!ise(a))return!1;const h=TF(e.current?.cesiumElement,c);if(!h)return!1;const d=Tt(a);if(!d)return!1;n?.(d.layerId||"",d.featureId,h)},[e,n]),o=R.useCallback((a,c)=>{const l=e.current?.cesiumElement;if(!l||l.isDestroyed())return!1;const u=Tt(a),h=TF(e.current?.cesiumElement,c);return i?.(u?.layerId||"",u?.featureId||"",h),!1},[e,i]),s=R.useRef(void 0);return R.useEffect(()=>{const a=e.current?.cesiumElement;if(!(!a||a.isDestroyed()))return s.current=new aE(a,{onDrag:r,onDrop:o,dragDelay:1e3,initialDisabled:!t}),()=>{!a||a.isDestroyed()||s.current?.disable()}},[e,t,r,o]),{handleLayerDrag:r,handleLayerDrop:o}},cE=(e,t)=>{if(!e||e.isDestroyed())return;const n=t.position||t.startPosition;return{x:n?.x,y:n?.y,...n?Yv(e.scene,n.x,n.y,!0)??{}:{}}},zLe=({cesium:e,engineAPI:t,featureFlags:n,onLayerSelectWithRectStart:i,onLayerSelectWithRectMove:r,onLayerSelectWithRectEnd:o})=>{const s=R.useRef([0,0]),a=R.useRef(!1),c=R.useRef(!1),l=R.useCallback((f,p)=>{if(a.current||c.current||n!==z0.selection||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const m=cE(e.current.cesiumElement,f)??{};s.current=[m.x??0,m.y??0],c.current=!0,a.current=!1,i?.({...m,pressedKey:p})},[i,e,n]),u=R.useCallback((f,p,m)=>{if(!c.current||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const y=cE(e.current.cesiumElement,f)??{};let[g,v]=s.current,[S,T]=[y.x??0,y.y??0];if(S-g===0&&T-v===0)return y;m||(a.current=!0),g>S&&([S,g]=[g,S]),v>T&&([T,v]=[v,T]);const C={...y,pressedKey:p,x:S,y:T,startX:g,startY:v,width:S-g,height:T-v};return r?.(C),C},[r,e]),h=R.useCallback((f,p)=>{if(!c.current||!e.current?.cesiumElement||e.current.cesiumElement.isDestroyed())return;const m=u(f,p,!0),{startX:y=0,startY:g=0,x:v=0,y:S=0,width:T=0,height:C=0}=m??{},[O,V]=[y+T/2,g+C/2],A=a.current?t.pickManyFromViewport([O,V],T,C):t.pickManyFromViewport([v,S],1,1);o?.({...m,pressedKey:p,features:A??[],isClick:!a.current}),a.current=!1,c.current=!1},[o,e,t,u]);return R.useMemo(()=>Object.fromEntries(Object.entries({start:{handler:l,keys:["shift"]},move:{handler:u,keys:["shift"]},end:{handler:h,keys:["shift"]}}).map(([p,m])=>[p,{handler:m.handler,...Object.fromEntries(m.keys.map(y=>[y,g=>m.handler(g,y)]))}])),[h,u,l])},NLe=`uniform vec3 u_reearth_sphericalHarmonicCoefficients[9];
6089
6089
  uniform bool u_reearth_globeImageBasedLighting;
6090
6090
 
6091
6091
  vec4 reearth_computeImageBasedLightingColor(vec4 color);
@@ -6728,7 +6728,7 @@ vec3 getTurboColormap(const float v) {
6728
6728
  ${zb}
6729
6729
  ${oPe}
6730
6730
  ${nPe}
6731
- `,uniforms:{...Yr(u,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>c?.()??d._depthTexture}});if(r){const f=ePe({prefix:e,outputType:s,useGlobeDepth:a,getGlobeDepthTexture:c,uniforms:{textureScale:t,...Yr(u,["frustumLength","normalExponent","depthExponent"])}}),p=new M.PostProcessStageComposite({name:`${e}_ambient_occlusion_generate_and_filter`,stages:[h,f]});return d.uniforms.ambientOcclusionTexture=p.name,new M.PostProcessStageComposite({name:`${e}_ambient_occlusion`,stages:[p,d],inputPreviousStageTexture:!1,uniforms:fE([{stage:h,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:f,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:d,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return d.uniforms.ambientOcclusionTexture=h.name,new M.PostProcessStageComposite({name:`${e}_ambient_occlusion`,stages:[h,d],inputPreviousStageTexture:!1,uniforms:fE([{stage:h,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:d,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}const cPe=({enabled:e=!0,textureScale:t,directions:n,steps:i,denoise:r,accurateNormalReconstruction:o,outputType:s,useGlobeDepth:a,...c})=>{const{viewer:l}=$n(),u=l?.scene,h=fF({owner:u?.postProcessStages,keys:[t,i,n,r,o,s,a],create:()=>{const d=aPe({textureScale:t,steps:i,directions:n,denoise:r,accurateNormalReconstruction:o,outputType:s,useGlobeDepth:a,getGlobeDepthTexture:()=>u.context.uniformState.globeDepthTexture,uniforms:c});return d.enabled=e,d},transferOwnership:(d,f)=>(f?.add(d),()=>{f?.remove(d)})});return h.enabled=e,Object.assign(h.uniforms,c),u?.requestRender(),Gl(()=>{const d=u?.camera.frustum;if(d instanceof M.PerspectiveFrustum&&d.fovy!==void 0&&d.aspectRatio!==void 0){const f=1/Math.tan(d.fovy/2);h.uniforms.focalLength.x=f*d.aspectRatio,h.uniforms.focalLength.y=f}}),null},lPe=e=>{const t=$n(),[n,i]=R.useState(!1);return Gl(()=>{const r=t.scene;i(!r?.globe.depthTestAgainstTerrain);const{globeHeight:o}=r;if(!r||o==null)return;const s=r.camera.positionCartographic.height-o,a=r?.camera.frustum;a instanceof M.PerspectiveFrustum&&a.fov!==void 0&&(r.camera.frustum.near=M.Math.clamp(s-1,1,5)/Math.tan(a.fov/2))}),ce.jsx(cPe,{...e,useGlobeDepth:n})};var SN=(e=>(e[e.Occlusion=1]="Occlusion",e[e.Normal=2]="Normal",e[e.Depth=3]="Depth",e[e.Weight=4]="Weight",e[e.Shade=5]="Shade",e))(SN||{});const uPe={low:{directions:4,steps:4,textureScale:.5,maxRadius:30},medium:{directions:4,steps:8,textureScale:.5,maxRadius:40},high:{directions:8,steps:8,textureScale:1,maxRadius:40},extreme:{directions:16,steps:16,textureScale:1,maxRadius:40}},hPe="#00bebe",h0="#3B3CD0",dPe="#FF9900",fPe="#3B3CD0";let Jl,pPe,mPe,Ql;const d0=({position:e,clampToGround:t=!1,index:n,isEditing:i,isSelected:r,isAddingPoint:o,isExtrudedControlPoint:s,handleControlPointMouseEvent:a})=>{const c=R.useRef(e);c.current=e;const l=Xo(()=>new yo((f,p)=>"getValue"in c.current?c.current.getValue(f,p):c.current,!1)),u=R.useMemo(()=>({position:l,billboard:{image:i?o?_Pe():r?bPe():yPe():gPe(),width:i?16:8,height:i?16:8,heightReference:t?vl.CLAMP_TO_GROUND:vl.NONE,disableDepthTestDistance:1/0}}),[t,l,o,i,r]),h=R.useCallback(()=>{a?.(n,!!s,"mousedown")},[n,s,a]),d=R.useCallback(()=>{a?.(n,!!s,"click")},[n,s,a]);return ce.jsx(uc,{...u,onMouseDown:h,onClick:d})};function gPe(){if(Jl!=null)return Jl;Jl=document.createElement("canvas"),Jl.width=16,Jl.height=16;const e=Jl.getContext("2d");return Vn(e!=null),e.fillStyle="white",e.fillRect(3,3,10,10),e.strokeStyle="black",e.lineWidth=2,e.strokeRect(3,3,10,10),Jl}function yPe(){return EN(pPe,{size:32,color:"white",strokeColor:h0})}function bPe(){return EN(mPe,{size:32,color:"white",strokeColor:dPe})}function _Pe(){if(Ql!=null)return Ql;Ql=document.createElement("canvas"),Ql.width=32,Ql.height=32;const e=Ql.getContext("2d");return Vn(e!=null),e.beginPath(),e.arc(16,16,12,0,2*Math.PI),e.fillStyle="white",e.fill(),e.strokeStyle=fPe,e.lineWidth=4,e.stroke(),e.beginPath(),e.moveTo(16,8),e.lineTo(16,24),e.stroke(),e.moveTo(8,16),e.lineTo(24,16),e.stroke(),Ql}function EN(e,t){if(e!=null)return e;e=document.createElement("canvas"),e.width=t.size,e.height=t.size;const n=e.getContext("2d");return Vn(n!=null),n.beginPath(),n.arc(t.size/2,t.size/2,t.size/2-4,0,2*Math.PI),n.fillStyle=t.color,n.fill(),n.strokeStyle=t.strokeColor,n.lineWidth=4,n.stroke(),e}function vPe(e,t){if(typeof e=="function")return e(t),()=>{e(null)};if(e!=null)return e.current=t,()=>{e.current=null}}const f0=R.memo(R.forwardRef(({entities:e,...t},n)=>{const{viewer:i}=$n(),r=i?.scene,o=i?.entities,s=e??o,[a,c]=R.useState(()=>new qr(t));return R.useEffect(()=>{c(new qr(t))},[t.id]),R.useEffect(()=>(s?.add(a),()=>{s?.remove(a),r?.requestRender()}),[r,s,a]),R.useEffect(()=>vPe(n,a),[n,a]),Object.assign(a,Ka(t,"id")),r?.requestRender(),null})),wPe={padding:"5px",color:"#fff",backgroundColor:"#000",borderRadius:"5px",lineHeight:1},TN=({children:e})=>ce.jsx("div",{style:wPe,children:e}),CN=R.createContext({});function RN(e){const t=R.useRef(null);return t.current===null&&(t.current=e()),t.current}const xPe=typeof window<"u"?R.useLayoutEffect:R.useEffect,pE=R.createContext(null);function mE(e,t){e.indexOf(t)===-1&&e.push(t)}function Nb(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const ta=(e,t,n)=>n>t?t:n<e?e:n;function gE(e,t){return t?`${e}. For more information and steps for solving, visit https://motion.dev/troubleshooting/${t}`:e}let Jh=()=>{},Da=()=>{};typeof process<"u"&&process.env?.NODE_ENV!=="production"&&(Jh=(e,t,n)=>{!e&&typeof console<"u"&&console.warn(gE(t,n))},Da=(e,t,n)=>{if(!e)throw new Error(gE(t,n))});const Ua={},IN=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function MN(e){return typeof e=="object"&&e!==null}const LN=e=>/^0[^.\s]+$/u.test(e);function PN(e){let t;return()=>(t===void 0&&(t=e()),t)}const Vo=e=>e,SPe=(e,t)=>n=>t(e(n)),p0=(...e)=>e.reduce(SPe),m0=(e,t,n)=>{const i=t-e;return i===0?1:(n-e)/i};class yE{constructor(){this.subscriptions=[]}add(t){return mE(this.subscriptions,t),()=>Nb(this.subscriptions,t)}notify(t,n,i){const r=this.subscriptions.length;if(r)if(r===1)this.subscriptions[0](t,n,i);else for(let o=0;o<r;o++){const s=this.subscriptions[o];s&&s(t,n,i)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const Fo=e=>e*1e3,Ao=e=>e/1e3;function ON(e,t){return t?e*(1e3/t):0}const GN=new Set;function bE(e,t,n){e||GN.has(t)||(console.warn(gE(t,n)),GN.add(t))}const VN=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,EPe=1e-7,TPe=12;function CPe(e,t,n,i,r){let o,s,a=0;do s=t+(n-t)/2,o=VN(s,i,r)-e,o>0?n=s:t=s;while(Math.abs(o)>EPe&&++a<TPe);return s}function g0(e,t,n,i){if(e===t&&n===i)return Vo;const r=o=>CPe(o,0,1,e,n);return o=>o===0||o===1?o:VN(r(o),t,i)}const FN=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,AN=e=>t=>1-e(1-t),zN=g0(.33,1.53,.69,.99),_E=AN(zN),NN=FN(_E),kN=e=>(e*=2)<1?.5*_E(e):.5*(2-Math.pow(2,-10*(e-1))),vE=e=>1-Math.sin(Math.acos(e)),XN=AN(vE),ZN=FN(vE),RPe=g0(.42,0,1,1),IPe=g0(0,0,.58,1),DN=g0(.42,0,.58,1),MPe=e=>Array.isArray(e)&&typeof e[0]!="number",UN=e=>Array.isArray(e)&&typeof e[0]=="number",WN={linear:Vo,easeIn:RPe,easeInOut:DN,easeOut:IPe,circIn:vE,circInOut:ZN,circOut:XN,backIn:_E,backInOut:NN,backOut:zN,anticipate:kN},LPe=e=>typeof e=="string",BN=e=>{if(UN(e)){Da(e.length===4,"Cubic bezier arrays must contain four numerical values.","cubic-bezier-length");const[t,n,i,r]=e;return g0(t,n,i,r)}else if(LPe(e))return Da(WN[e]!==void 0,`Invalid easing type '${e}'`,"invalid-easing-type"),WN[e];return e},kb=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function PPe(e,t){let n=new Set,i=new Set,r=!1,o=!1;const s=new WeakSet;let a={delta:0,timestamp:0,isProcessing:!1};function c(u){s.has(u)&&(l.schedule(u),e()),u(a)}const l={schedule:(u,h=!1,d=!1)=>{const p=d&&r?n:i;return h&&s.add(u),p.has(u)||p.add(u),u},cancel:u=>{i.delete(u),s.delete(u)},process:u=>{if(a=u,r){o=!0;return}r=!0,[n,i]=[i,n],n.forEach(c),n.clear(),r=!1,o&&(o=!1,l.process(u))}};return l}const OPe=40;function YN(e,t){let n=!1,i=!0;const r={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,s=kb.reduce((S,T)=>(S[T]=PPe(o),S),{}),{setup:a,read:c,resolveKeyframes:l,preUpdate:u,update:h,preRender:d,render:f,postRender:p}=s,m=()=>{const S=Ua.useManualTiming?r.timestamp:performance.now();n=!1,Ua.useManualTiming||(r.delta=i?1e3/60:Math.max(Math.min(S-r.timestamp,OPe),1)),r.timestamp=S,r.isProcessing=!0,a.process(r),c.process(r),l.process(r),u.process(r),h.process(r),d.process(r),f.process(r),p.process(r),r.isProcessing=!1,n&&t&&(i=!1,e(m))},y=()=>{n=!0,i=!0,r.isProcessing||e(m)};return{schedule:kb.reduce((S,T)=>{const C=s[T];return S[T]=(O,V=!1,A=!1)=>(n||y(),C.schedule(O,V,A)),S},{}),cancel:S=>{for(let T=0;T<kb.length;T++)s[kb[T]].cancel(S)},state:r,steps:s}}const{schedule:Tn,cancel:Bc,state:zi,steps:wE}=YN(typeof requestAnimationFrame<"u"?requestAnimationFrame:Vo,!0);let Xb;function GPe(){Xb=void 0}const yr={now:()=>(Xb===void 0&&yr.set(zi.isProcessing||Ua.useManualTiming?zi.timestamp:performance.now()),Xb),set:e=>{Xb=e,queueMicrotask(GPe)}},HN=e=>t=>typeof t=="string"&&t.startsWith(e),jN=HN("--"),VPe=HN("var(--"),xE=e=>VPe(e)?FPe.test(e.split("/*")[0].trim()):!1,FPe=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function KN(e){return typeof e!="string"?!1:e.split("/*")[0].includes("var(--")}const Qh={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},y0={...Qh,transform:e=>ta(0,1,e)},Zb={...Qh,default:1},b0=e=>Math.round(e*1e5)/1e5,SE=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function APe(e){return e==null}const zPe=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,EE=(e,t)=>n=>!!(typeof n=="string"&&zPe.test(n)&&n.startsWith(e)||t&&!APe(n)&&Object.prototype.hasOwnProperty.call(n,t)),JN=(e,t,n)=>i=>{if(typeof i!="string")return i;const[r,o,s,a]=i.match(SE);return{[e]:parseFloat(r),[t]:parseFloat(o),[n]:parseFloat(s),alpha:a!==void 0?parseFloat(a):1}},NPe=e=>ta(0,255,e),TE={...Qh,transform:e=>Math.round(NPe(e))},ql={test:EE("rgb","red"),parse:JN("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:i=1})=>"rgba("+TE.transform(e)+", "+TE.transform(t)+", "+TE.transform(n)+", "+b0(y0.transform(i))+")"};function kPe(e){let t="",n="",i="",r="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),i=e.substring(5,7),r=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),i=e.substring(3,4),r=e.substring(4,5),t+=t,n+=n,i+=i,r+=r),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(i,16),alpha:r?parseInt(r,16)/255:1}}const CE={test:EE("#"),parse:kPe,transform:ql.transform},_0=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Yc=_0("deg"),na=_0("%"),ct=_0("px"),XPe=_0("vh"),ZPe=_0("vw"),QN={...na,parse:e=>na.parse(e)/100,transform:e=>na.transform(e*100)},qh={test:EE("hsl","hue"),parse:JN("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:i=1})=>"hsla("+Math.round(e)+", "+na.transform(b0(t))+", "+na.transform(b0(n))+", "+b0(y0.transform(i))+")"},li={test:e=>ql.test(e)||CE.test(e)||qh.test(e),parse:e=>ql.test(e)?ql.parse(e):qh.test(e)?qh.parse(e):CE.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?ql.transform(e):qh.transform(e),getAnimatableNone:e=>{const t=li.parse(e);return t.alpha=0,li.transform(t)}},DPe=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function UPe(e){return isNaN(e)&&typeof e=="string"&&(e.match(SE)?.length||0)+(e.match(DPe)?.length||0)>0}const qN="number",$N="color",WPe="var",BPe="var(",ek="${}",YPe=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function v0(e){const t=e.toString(),n=[],i={color:[],number:[],var:[]},r=[];let o=0;const a=t.replace(YPe,c=>(li.test(c)?(i.color.push(o),r.push($N),n.push(li.parse(c))):c.startsWith(BPe)?(i.var.push(o),r.push(WPe),n.push(c)):(i.number.push(o),r.push(qN),n.push(parseFloat(c))),++o,ek)).split(ek);return{values:n,split:a,indexes:i,types:r}}function tk(e){return v0(e).values}function nk(e){const{split:t,types:n}=v0(e),i=t.length;return r=>{let o="";for(let s=0;s<i;s++)if(o+=t[s],r[s]!==void 0){const a=n[s];a===qN?o+=b0(r[s]):a===$N?o+=li.transform(r[s]):o+=r[s]}return o}}const HPe=e=>typeof e=="number"?0:li.test(e)?li.getAnimatableNone(e):e;function jPe(e){const t=tk(e);return nk(e)(t.map(HPe))}const fs={test:UPe,parse:tk,createTransformer:nk,getAnimatableNone:jPe};function RE(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function KPe({hue:e,saturation:t,lightness:n,alpha:i}){e/=360,t/=100,n/=100;let r=0,o=0,s=0;if(!t)r=o=s=n;else{const a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;r=RE(c,a,e+1/3),o=RE(c,a,e),s=RE(c,a,e-1/3)}return{red:Math.round(r*255),green:Math.round(o*255),blue:Math.round(s*255),alpha:i}}function Db(e,t){return n=>n>0?t:e}const Dn=(e,t,n)=>e+(t-e)*n,IE=(e,t,n)=>{const i=e*e,r=n*(t*t-i)+i;return r<0?0:Math.sqrt(r)},JPe=[CE,ql,qh],QPe=e=>JPe.find(t=>t.test(e));function ik(e){const t=QPe(e);if(Jh(!!t,`'${e}' is not an animatable color. Use the equivalent color code instead.`,"color-not-animatable"),!t)return!1;let n=t.parse(e);return t===qh&&(n=KPe(n)),n}const rk=(e,t)=>{const n=ik(e),i=ik(t);if(!n||!i)return Db(e,t);const r={...n};return o=>(r.red=IE(n.red,i.red,o),r.green=IE(n.green,i.green,o),r.blue=IE(n.blue,i.blue,o),r.alpha=Dn(n.alpha,i.alpha,o),ql.transform(r))},ME=new Set(["none","hidden"]);function qPe(e,t){return ME.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function $Pe(e,t){return n=>Dn(e,t,n)}function LE(e){return typeof e=="number"?$Pe:typeof e=="string"?xE(e)?Db:li.test(e)?rk:nOe:Array.isArray(e)?ok:typeof e=="object"?li.test(e)?rk:eOe:Db}function ok(e,t){const n=[...e],i=n.length,r=e.map((o,s)=>LE(o)(o,t[s]));return o=>{for(let s=0;s<i;s++)n[s]=r[s](o);return n}}function eOe(e,t){const n={...e,...t},i={};for(const r in n)e[r]!==void 0&&t[r]!==void 0&&(i[r]=LE(e[r])(e[r],t[r]));return r=>{for(const o in i)n[o]=i[o](r);return n}}function tOe(e,t){const n=[],i={color:0,var:0,number:0};for(let r=0;r<t.values.length;r++){const o=t.types[r],s=e.indexes[o][i[o]],a=e.values[s]??0;n[r]=a,i[o]++}return n}const nOe=(e,t)=>{const n=fs.createTransformer(t),i=v0(e),r=v0(t);return i.indexes.var.length===r.indexes.var.length&&i.indexes.color.length===r.indexes.color.length&&i.indexes.number.length>=r.indexes.number.length?ME.has(e)&&!r.values.length||ME.has(t)&&!i.values.length?qPe(e,t):p0(ok(tOe(i,r),r.values),n):(Jh(!0,`Complex values '${e}' and '${t}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`,"complex-values-different"),Db(e,t))};function sk(e,t,n){return typeof e=="number"&&typeof t=="number"&&typeof n=="number"?Dn(e,t,n):LE(e)(e,t)}const iOe=e=>{const t=({timestamp:n})=>e(n);return{start:(n=!0)=>Tn.update(t,n),stop:()=>Bc(t),now:()=>zi.isProcessing?zi.timestamp:yr.now()}},ak=(e,t,n=10)=>{let i="";const r=Math.max(Math.round(t/n),2);for(let o=0;o<r;o++)i+=Math.round(e(o/(r-1))*1e4)/1e4+", ";return`linear(${i.substring(0,i.length-2)})`},Ub=2e4;function PE(e){let t=0;const n=50;let i=e.next(t);for(;!i.done&&t<Ub;)t+=n,i=e.next(t);return t>=Ub?1/0:t}function rOe(e,t=100,n){const i=n({...e,keyframes:[0,t]}),r=Math.min(PE(i),Ub);return{type:"keyframes",ease:o=>i.next(r*o).value/t,duration:Ao(r)}}const oOe=5;function ck(e,t,n){const i=Math.max(t-oOe,0);return ON(n-e(i),t-i)}const Un={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},OE=.001;function sOe({duration:e=Un.duration,bounce:t=Un.bounce,velocity:n=Un.velocity,mass:i=Un.mass}){let r,o;Jh(e<=Fo(Un.maxDuration),"Spring duration must be 10 seconds or less","spring-duration-limit");let s=1-t;s=ta(Un.minDamping,Un.maxDamping,s),e=ta(Un.minDuration,Un.maxDuration,Ao(e)),s<1?(r=l=>{const u=l*s,h=u*e,d=u-n,f=GE(l,s),p=Math.exp(-h);return OE-d/f*p},o=l=>{const h=l*s*e,d=h*n+n,f=Math.pow(s,2)*Math.pow(l,2)*e,p=Math.exp(-h),m=GE(Math.pow(l,2),s);return(-r(l)+OE>0?-1:1)*((d-f)*p)/m}):(r=l=>{const u=Math.exp(-l*e),h=(l-n)*e+1;return-OE+u*h},o=l=>{const u=Math.exp(-l*e),h=(n-l)*(e*e);return u*h});const a=5/e,c=cOe(r,o,a);if(e=Fo(e),isNaN(c))return{stiffness:Un.stiffness,damping:Un.damping,duration:e};{const l=Math.pow(c,2)*i;return{stiffness:l,damping:s*2*Math.sqrt(i*l),duration:e}}}const aOe=12;function cOe(e,t,n){let i=n;for(let r=1;r<aOe;r++)i=i-e(i)/t(i);return i}function GE(e,t){return e*Math.sqrt(1-t*t)}const lOe=["duration","bounce"],uOe=["stiffness","damping","mass"];function lk(e,t){return t.some(n=>e[n]!==void 0)}function hOe(e){let t={velocity:Un.velocity,stiffness:Un.stiffness,damping:Un.damping,mass:Un.mass,isResolvedFromDuration:!1,...e};if(!lk(e,uOe)&&lk(e,lOe))if(t.velocity=0,e.visualDuration){const n=e.visualDuration,i=2*Math.PI/(n*1.2),r=i*i,o=2*ta(.05,1,1-(e.bounce||0))*Math.sqrt(r);t={...t,mass:Un.mass,stiffness:r,damping:o}}else{const n=sOe({...e,velocity:0});t={...t,...n,mass:Un.mass},t.isResolvedFromDuration=!0}return t}function Wb(e=Un.visualDuration,t=Un.bounce){const n=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:i,restDelta:r}=n;const o=n.keyframes[0],s=n.keyframes[n.keyframes.length-1],a={done:!1,value:o},{stiffness:c,damping:l,mass:u,duration:h,velocity:d,isResolvedFromDuration:f}=hOe({...n,velocity:-Ao(n.velocity||0)}),p=d||0,m=l/(2*Math.sqrt(c*u)),y=s-o,g=Ao(Math.sqrt(c/u)),v=Math.abs(y)<5;i||(i=v?Un.restSpeed.granular:Un.restSpeed.default),r||(r=v?Un.restDelta.granular:Un.restDelta.default);let S;if(m<1){const C=GE(g,m);S=O=>{const V=Math.exp(-m*g*O);return s-V*((p+m*g*y)/C*Math.sin(C*O)+y*Math.cos(C*O))}}else if(m===1)S=C=>s-Math.exp(-g*C)*(y+(p+g*y)*C);else{const C=g*Math.sqrt(m*m-1);S=O=>{const V=Math.exp(-m*g*O),A=Math.min(C*O,300);return s-V*((p+m*g*y)*Math.sinh(A)+C*y*Math.cosh(A))/C}}const T={calculatedDuration:f&&h||null,next:C=>{const O=S(C);if(f)a.done=C>=h;else{let V=C===0?p:0;m<1&&(V=C===0?Fo(p):ck(S,C,O));const A=Math.abs(V)<=i,G=Math.abs(s-O)<=r;a.done=A&&G}return a.value=a.done?s:O,a},toString:()=>{const C=Math.min(PE(T),Ub),O=ak(V=>T.next(C*V).value,C,30);return C+"ms "+O},toTransition:()=>{}};return T}Wb.applyToOptions=e=>{const t=rOe(e,100,Wb);return e.ease=t.ease,e.duration=Fo(t.duration),e.type="keyframes",e};function VE({keyframes:e,velocity:t=0,power:n=.8,timeConstant:i=325,bounceDamping:r=10,bounceStiffness:o=500,modifyTarget:s,min:a,max:c,restDelta:l=.5,restSpeed:u}){const h=e[0],d={done:!1,value:h},f=A=>a!==void 0&&A<a||c!==void 0&&A>c,p=A=>a===void 0?c:c===void 0||Math.abs(a-A)<Math.abs(c-A)?a:c;let m=n*t;const y=h+m,g=s===void 0?y:s(y);g!==y&&(m=g-h);const v=A=>-m*Math.exp(-A/i),S=A=>g+v(A),T=A=>{const G=v(A),k=S(A);d.done=Math.abs(G)<=l,d.value=d.done?g:k};let C,O;const V=A=>{f(d.value)&&(C=A,O=Wb({keyframes:[d.value,p(d.value)],velocity:ck(S,A,d.value),damping:r,stiffness:o,restDelta:l,restSpeed:u}))};return V(0),{calculatedDuration:null,next:A=>{let G=!1;return!O&&C===void 0&&(G=!0,T(A),V(A)),C!==void 0&&A>=C?O.next(A-C):(!G&&T(A),d)}}}function dOe(e,t,n){const i=[],r=n||Ua.mix||sk,o=e.length-1;for(let s=0;s<o;s++){let a=r(e[s],e[s+1]);if(t){const c=Array.isArray(t)?t[s]||Vo:t;a=p0(c,a)}i.push(a)}return i}function fOe(e,t,{clamp:n=!0,ease:i,mixer:r}={}){const o=e.length;if(Da(o===t.length,"Both input and output ranges must be the same length","range-length"),o===1)return()=>t[0];if(o===2&&t[0]===t[1])return()=>t[1];const s=e[0]===e[1];e[0]>e[o-1]&&(e=[...e].reverse(),t=[...t].reverse());const a=dOe(t,i,r),c=a.length,l=u=>{if(s&&u<e[0])return t[0];let h=0;if(c>1)for(;h<e.length-2&&!(u<e[h+1]);h++);const d=m0(e[h],e[h+1],u);return a[h](d)};return n?u=>l(ta(e[0],e[o-1],u)):l}function pOe(e,t){const n=e[e.length-1];for(let i=1;i<=t;i++){const r=m0(0,t,i);e.push(Dn(n,1,r))}}function mOe(e){const t=[0];return pOe(t,e.length-1),t}function gOe(e,t){return e.map(n=>n*t)}function yOe(e,t){return e.map(()=>t||DN).splice(0,e.length-1)}function $h({duration:e=300,keyframes:t,times:n,ease:i="easeInOut"}){const r=MPe(i)?i.map(BN):BN(i),o={done:!1,value:t[0]},s=gOe(n&&n.length===t.length?n:mOe(t),e),a=fOe(s,t,{ease:Array.isArray(r)?r:yOe(t,r)});return{calculatedDuration:e,next:c=>(o.value=a(c),o.done=c>=e,o)}}const bOe=e=>e!==null;function FE(e,{repeat:t,repeatType:n="loop"},i,r=1){const o=e.filter(bOe),a=r<0||t&&n!=="loop"&&t%2===1?0:o.length-1;return!a||i===void 0?o[a]:i}const _Oe={decay:VE,inertia:VE,tween:$h,keyframes:$h,spring:Wb};function uk(e){typeof e.type=="string"&&(e.type=_Oe[e.type])}class AE{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,n){return this.finished.then(t,n)}}const vOe=e=>e/100;class zE extends AE{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==yr.now()&&this.tick(yr.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;uk(t);const{type:n=$h,repeat:i=0,repeatDelay:r=0,repeatType:o,velocity:s=0}=t;let{keyframes:a}=t;const c=n||$h;process.env.NODE_ENV!=="production"&&c!==$h&&Da(a.length<=2,`Only two keyframes currently supported with spring and inertia animations. Trying to animate ${a}`,"spring-two-frames"),c!==$h&&typeof a[0]!="number"&&(this.mixKeyframes=p0(vOe,sk(a[0],a[1])),a=[0,100]);const l=c({...t,keyframes:a});o==="mirror"&&(this.mirroredGenerator=c({...t,keyframes:[...a].reverse(),velocity:-s})),l.calculatedDuration===null&&(l.calculatedDuration=PE(l));const{calculatedDuration:u}=l;this.calculatedDuration=u,this.resolvedDuration=u+r,this.totalDuration=this.resolvedDuration*(i+1)-r,this.generator=l}updateTime(t){const n=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(t,n=!1){const{generator:i,totalDuration:r,mixKeyframes:o,mirroredGenerator:s,resolvedDuration:a,calculatedDuration:c}=this;if(this.startTime===null)return i.next(0);const{delay:l=0,keyframes:u,repeat:h,repeatType:d,repeatDelay:f,type:p,onUpdate:m,finalKeyframe:y}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-r/this.speed,this.startTime)),n?this.currentTime=t:this.updateTime(t);const g=this.currentTime-l*(this.playbackSpeed>=0?1:-1),v=this.playbackSpeed>=0?g<0:g>r;this.currentTime=Math.max(g,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=r);let S=this.currentTime,T=i;if(h){const A=Math.min(this.currentTime,r)/a;let G=Math.floor(A),k=A%1;!k&&A>=1&&(k=1),k===1&&G--,G=Math.min(G,h+1),G%2&&(d==="reverse"?(k=1-k,f&&(k-=f/a)):d==="mirror"&&(T=s)),S=ta(0,1,k)*a}const C=v?{done:!1,value:u[0]}:T.next(S);o&&!v&&(C.value=o(C.value));let{done:O}=C;!v&&c!==null&&(O=this.playbackSpeed>=0?this.currentTime>=r:this.currentTime<=0);const V=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&O);return V&&p!==VE&&(C.value=FE(u,this.options,y,this.speed)),m&&m(C.value),V&&this.finish(),C}then(t,n){return this.finished.then(t,n)}get duration(){return Ao(this.calculatedDuration)}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ao(t)}get time(){return Ao(this.currentTime)}set time(t){t=Fo(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=t,this.tick(t))}get speed(){return this.playbackSpeed}set speed(t){const n=this.playbackSpeed!==t;n&&this.driver&&this.updateTime(yr.now()),this.playbackSpeed=t,n&&this.driver&&(this.time=Ao(this.currentTime))}play(){if(this.isStopped)return;const{driver:t=iOe,startTime:n}=this.options;this.driver||(this.driver=t(r=>this.tick(r))),this.options.onPlay?.();const i=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=i):this.holdTime!==null?this.startTime=i-this.holdTime:this.startTime||(this.startTime=n??i),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(yr.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),t.observe(this)}}function wOe(e){for(let t=1;t<e.length;t++)e[t]??(e[t]=e[t-1])}const $l=e=>e*180/Math.PI,NE=e=>{const t=$l(Math.atan2(e[1],e[0]));return kE(t)},xOe={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:NE,rotateZ:NE,skewX:e=>$l(Math.atan(e[1])),skewY:e=>$l(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},kE=e=>(e=e%360,e<0&&(e+=360),e),hk=NE,dk=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),fk=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),SOe={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:dk,scaleY:fk,scale:e=>(dk(e)+fk(e))/2,rotateX:e=>kE($l(Math.atan2(e[6],e[5]))),rotateY:e=>kE($l(Math.atan2(-e[2],e[0]))),rotateZ:hk,rotate:hk,skewX:e=>$l(Math.atan(e[4])),skewY:e=>$l(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function XE(e){return e.includes("scale")?1:0}function ZE(e,t){if(!e||e==="none")return XE(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let i,r;if(n)i=SOe,r=n;else{const a=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);i=xOe,r=a}if(!r)return XE(t);const o=i[t],s=r[1].split(",").map(TOe);return typeof o=="function"?o(s):s[o]}const EOe=(e,t)=>{const{transform:n="none"}=getComputedStyle(e);return ZE(n,t)};function TOe(e){return parseFloat(e.trim())}const ed=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],td=new Set(ed),pk=e=>e===Qh||e===ct,COe=new Set(["x","y","z"]),ROe=ed.filter(e=>!COe.has(e));function IOe(e){const t=[];return ROe.forEach(n=>{const i=e.getValue(n);i!==void 0&&(t.push([n,i.get()]),i.set(n.startsWith("scale")?1:0))}),t}const Hc={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>ZE(t,"x"),y:(e,{transform:t})=>ZE(t,"y")};Hc.translateX=Hc.x,Hc.translateY=Hc.y;const eu=new Set;let DE=!1,UE=!1,WE=!1;function mk(){if(UE){const e=Array.from(eu).filter(i=>i.needsMeasurement),t=new Set(e.map(i=>i.element)),n=new Map;t.forEach(i=>{const r=IOe(i);r.length&&(n.set(i,r),i.render())}),e.forEach(i=>i.measureInitialState()),t.forEach(i=>{i.render();const r=n.get(i);r&&r.forEach(([o,s])=>{i.getValue(o)?.set(s)})}),e.forEach(i=>i.measureEndState()),e.forEach(i=>{i.suspendedScrollY!==void 0&&window.scrollTo(0,i.suspendedScrollY)})}UE=!1,DE=!1,eu.forEach(e=>e.complete(WE)),eu.clear()}function gk(){eu.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(UE=!0)})}function MOe(){WE=!0,gk(),mk(),WE=!1}class BE{constructor(t,n,i,r,o,s=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=n,this.name=i,this.motionValue=r,this.element=o,this.isAsync=s}scheduleResolve(){this.state="scheduled",this.isAsync?(eu.add(this),DE||(DE=!0,Tn.read(gk),Tn.resolveKeyframes(mk))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:n,element:i,motionValue:r}=this;if(t[0]===null){const o=r?.get(),s=t[t.length-1];if(o!==void 0)t[0]=o;else if(i&&n){const a=i.readValue(n,s);a!=null&&(t[0]=a)}t[0]===void 0&&(t[0]=s),r&&o===void 0&&r.set(t[0])}wOe(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),eu.delete(this)}cancel(){this.state==="scheduled"&&(eu.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const LOe=e=>e.startsWith("--");function yk(e,t,n){LOe(t)?e.style.setProperty(t,n):e.style[t]=n}const POe={};function bk(e,t){const n=PN(e);return()=>POe[t]??n()}const OOe=bk(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),_k=bk(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),w0=([e,t,n,i])=>`cubic-bezier(${e}, ${t}, ${n}, ${i})`,vk={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:w0([0,.65,.55,1]),circOut:w0([.55,0,1,.45]),backIn:w0([.31,.01,.66,-.59]),backOut:w0([.33,1.53,.69,.99])};function wk(e,t){if(e)return typeof e=="function"?_k()?ak(e,t):"ease-out":UN(e)?w0(e):Array.isArray(e)?e.map(n=>wk(n,t)||vk.easeOut):vk[e]}function GOe(e,t,n,{delay:i=0,duration:r=300,repeat:o=0,repeatType:s="loop",ease:a="easeOut",times:c}={},l=void 0){const u={[t]:n};c&&(u.offset=c);const h=wk(a,r);Array.isArray(h)&&(u.easing=h);const d={delay:i,duration:r,easing:Array.isArray(h)?"linear":h,fill:"both",iterations:o+1,direction:s==="reverse"?"alternate":"normal"};return l&&(d.pseudoElement=l),e.animate(u,d)}function xk(e){return typeof e=="function"&&"applyToOptions"in e}function VOe({type:e,...t}){return xk(e)&&_k()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class Sk extends AE{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!t)return;const{element:n,name:i,keyframes:r,pseudoElement:o,allowFlatten:s=!1,finalKeyframe:a,onComplete:c}=t;this.isPseudoElement=!!o,this.allowFlatten=s,this.options=t,Da(typeof t.type!="string",`Mini animate() doesn't support "type" as a string.`,"mini-spring");const l=VOe(t);this.animation=GOe(n,i,r,l,o),l.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!o){const u=FE(r,this.options,a,this.speed);this.updateMotionValue&&this.updateMotionValue(u),yk(n,i,u),this.animation.cancel()}c?.(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){const t=this.options?.element;!this.isPseudoElement&&t?.isConnected&&this.animation.commitStyles?.()}get duration(){const t=this.animation.effect?.getComputedTiming?.().duration||0;return Ao(Number(t))}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ao(t)}get time(){return Ao(Number(this.animation.currentTime)||0)}set time(t){const n=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=Fo(t),n&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(t){this.manualStartTime=this.animation.startTime=t}attachTimeline({timeline:t,rangeStart:n,rangeEnd:i,observe:r}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,t&&OOe()?(this.animation.timeline=t,n&&(this.animation.rangeStart=n),i&&(this.animation.rangeEnd=i),Vo):r(this)}}const Ek={anticipate:kN,backInOut:NN,circInOut:ZN};function FOe(e){return e in Ek}function AOe(e){typeof e.ease=="string"&&FOe(e.ease)&&(e.ease=Ek[e.ease])}const YE=10;class zOe extends Sk{constructor(t){AOe(t),uk(t),super(t),t.startTime!==void 0&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:n,onUpdate:i,onComplete:r,element:o,...s}=this.options;if(!n)return;if(t!==void 0){n.set(t);return}const a=new zE({...s,autoplay:!1}),c=Math.max(YE,yr.now()-this.startTime),l=ta(0,YE,c-YE),u=a.sample(c).value,{name:h}=this.options;o&&h&&yk(o,h,u),n.setWithVelocity(a.sample(Math.max(0,c-l)).value,u,l),a.stop()}}const Tk=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(fs.test(e)||e==="0")&&!e.startsWith("url("));function NOe(e){const t=e[0];if(e.length===1)return!0;for(let n=0;n<e.length;n++)if(e[n]!==t)return!0}function kOe(e,t,n,i){const r=e[0];if(r===null)return!1;if(t==="display"||t==="visibility")return!0;const o=e[e.length-1],s=Tk(r,t),a=Tk(o,t);return Jh(s===a,`You are trying to animate ${t} from "${r}" to "${o}". "${s?o:r}" is not an animatable value.`,"value-not-animatable"),!s||!a?!1:NOe(e)||(n==="spring"||xk(n))&&i}function HE(e){e.duration=0,e.type="keyframes"}const XOe=new Set(["opacity","clipPath","filter","transform"]),ZOe=PN(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));function DOe(e){const{motionValue:t,name:n,repeatDelay:i,repeatType:r,damping:o,type:s}=e;if(!(t?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:c,transformTemplate:l}=t.owner.getProps();return ZOe()&&n&&XOe.has(n)&&(n!=="transform"||!l)&&!c&&!i&&r!=="mirror"&&o!==0&&s!=="inertia"}const UOe=40;class WOe extends AE{constructor({autoplay:t=!0,delay:n=0,type:i="keyframes",repeat:r=0,repeatDelay:o=0,repeatType:s="loop",keyframes:a,name:c,motionValue:l,element:u,...h}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=yr.now();const d={autoplay:t,delay:n,type:i,repeat:r,repeatDelay:o,repeatType:s,name:c,motionValue:l,element:u,...h},f=u?.KeyframeResolver||BE;this.keyframeResolver=new f(a,(p,m,y)=>this.onKeyframesResolved(p,m,d,!y),c,l,u),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(t,n,i,r){this.keyframeResolver=void 0;const{name:o,type:s,velocity:a,delay:c,isHandoff:l,onUpdate:u}=i;this.resolvedAt=yr.now(),kOe(t,o,s,a)||((Ua.instantAnimations||!c)&&u?.(FE(t,i,n)),t[0]=t[t.length-1],HE(i),i.repeat=0);const d={startTime:r?this.resolvedAt?this.resolvedAt-this.createdAt>UOe?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...i,keyframes:t},f=!l&&DOe(d),p=d.motionValue?.owner?.current,m=f?new zOe({...d,element:p}):new zE(d);m.finished.then(()=>{this.notifyFinished()}).catch(Vo),this.pendingTimeline&&(this.stopTimeline=m.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=m}get finished(){return this._animation?this.animation.finished:this._finished}then(t,n){return this.finished.finally(t).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),MOe()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}function Ck(e,t,n,i=0,r=1){const o=Array.from(e).sort((l,u)=>l.sortNodePosition(u)).indexOf(t),s=e.size,a=(s-1)*i;return typeof n=="function"?n(o,s):r===1?o*i:a-o*i}const BOe=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function YOe(e){const t=BOe.exec(e);if(!t)return[,];const[,n,i,r]=t;return[`--${n??i}`,r]}const HOe=4;function Rk(e,t,n=1){Da(n<=HOe,`Max CSS variable fallback depth detected in property "${e}". This may indicate a circular fallback dependency.`,"max-css-var-depth");const[i,r]=YOe(e);if(!i)return;const o=window.getComputedStyle(t).getPropertyValue(i);if(o){const s=o.trim();return IN(s)?parseFloat(s):s}return xE(r)?Rk(r,t,n+1):r}const jOe={type:"spring",stiffness:500,damping:25,restSpeed:10},KOe=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),JOe={type:"keyframes",duration:.8},QOe={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},qOe=(e,{keyframes:t})=>t.length>2?JOe:td.has(e)?e.startsWith("scale")?KOe(t[1]):jOe:QOe,$Oe=e=>e!==null;function eGe(e,{repeat:t,repeatType:n="loop"},i){const r=e.filter($Oe),o=t&&n!=="loop"&&t%2===1?0:r.length-1;return r[o]}function Ik(e,t){if(e?.inherit&&t){const{inherit:n,...i}=e;return{...t,...i}}return e}function jE(e,t){const n=e?.[t]??e?.default??e;return n!==e?Ik(n,e):n}function tGe({when:e,delay:t,delayChildren:n,staggerChildren:i,staggerDirection:r,repeat:o,repeatType:s,repeatDelay:a,from:c,elapsed:l,...u}){return!!Object.keys(u).length}const KE=(e,t,n,i={},r,o)=>s=>{const a=jE(i,e)||{},c=a.delay||i.delay||0;let{elapsed:l=0}=i;l=l-Fo(c);const u={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...a,delay:-l,onUpdate:d=>{t.set(d),a.onUpdate&&a.onUpdate(d)},onComplete:()=>{s(),a.onComplete&&a.onComplete()},name:e,motionValue:t,element:o?void 0:r};tGe(a)||Object.assign(u,qOe(e,u)),u.duration&&(u.duration=Fo(u.duration)),u.repeatDelay&&(u.repeatDelay=Fo(u.repeatDelay)),u.from!==void 0&&(u.keyframes[0]=u.from);let h=!1;if((u.type===!1||u.duration===0&&!u.repeatDelay)&&(HE(u),u.delay===0&&(h=!0)),(Ua.instantAnimations||Ua.skipAnimations||r?.shouldSkipAnimations)&&(h=!0,HE(u),u.delay=0),u.allowFlatten=!a.type&&!a.ease,h&&!o&&t.get()!==void 0){const d=eGe(u.keyframes,a);if(d!==void 0){Tn.update(()=>{u.onUpdate(d),u.onComplete()});return}}return a.isSync?new zE(u):new WOe(u)};function Mk(e){const t=[{},{}];return e?.values.forEach((n,i)=>{t[0][i]=n.get(),t[1][i]=n.getVelocity()}),t}function JE(e,t,n,i){if(typeof t=="function"){const[r,o]=Mk(i);t=t(n!==void 0?n:e.custom,r,o)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[r,o]=Mk(i);t=t(n!==void 0?n:e.custom,r,o)}return t}function nd(e,t,n){const i=e.getProps();return JE(i,t,n!==void 0?n:i.custom,e)}const Lk=new Set(["width","height","top","left","right","bottom",...ed]),Pk=30,nGe=e=>!isNaN(parseFloat(e));class iGe{constructor(t,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=i=>{const r=yr.now();if(this.updatedAt!==r&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(i),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const o of this.dependents)o.dirty()},this.hasAnimated=!1,this.setCurrent(t),this.owner=n.owner}setCurrent(t){this.current=t,this.updatedAt=yr.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=nGe(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return process.env.NODE_ENV!=="production"&&bE(!1,'value.onChange(callback) is deprecated. Switch to value.on("change", callback).'),this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new yE);const i=this.events[t].add(n);return t==="change"?()=>{i(),Tn.read(()=>{this.events.change.getSize()||this.stop()})}:i}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t){this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t)}setWithVelocity(t,n,i){this.set(n),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-i}jump(t,n=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=yr.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>Pk)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,Pk);return ON(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function tu(e,t){return new iGe(e,t)}const QE=e=>Array.isArray(e);function rGe(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,tu(n))}function oGe(e){return QE(e)?e[e.length-1]||0:e}function sGe(e,t){const n=nd(e,t);let{transitionEnd:i={},transition:r={},...o}=n||{};o={...o,...i};for(const s in o){const a=oGe(o[s]);rGe(e,s,a)}}const tr=e=>!!(e&&e.getVelocity);function aGe(e){return!!(tr(e)&&e.add)}function qE(e,t){const n=e.getValue("willChange");if(aGe(n))return n.add(t);if(!n&&Ua.WillChange){const i=new Ua.WillChange("auto");e.addValue("willChange",i),i.add(t)}}function $E(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}const Ok="data-"+$E("framerAppearId");function Gk(e){return e.props[Ok]}function cGe({protectedKeys:e,needsAnimating:t},n){const i=e.hasOwnProperty(n)&&t[n]!==!0;return t[n]=!1,i}function Vk(e,t,{delay:n=0,transitionOverride:i,type:r}={}){let{transition:o,transitionEnd:s,...a}=t;const c=e.getDefaultTransition();o=o?Ik(o,c):c;const l=o?.reduceMotion;i&&(o=i);const u=[],h=r&&e.animationState&&e.animationState.getState()[r];for(const d in a){const f=e.getValue(d,e.latestValues[d]??null),p=a[d];if(p===void 0||h&&cGe(h,d))continue;const m={delay:n,...jE(o||{},d)},y=f.get();if(y!==void 0&&!f.isAnimating&&!Array.isArray(p)&&p===y&&!m.velocity)continue;let g=!1;if(window.MotionHandoffAnimation){const T=Gk(e);if(T){const C=window.MotionHandoffAnimation(T,d,Tn);C!==null&&(m.startTime=C,g=!0)}}qE(e,d);const v=l??e.shouldReduceMotion;f.start(KE(d,f,p,v&&Lk.has(d)?{type:!1}:m,e,g));const S=f.animation;S&&u.push(S)}if(s){const d=()=>Tn.update(()=>{s&&sGe(e,s)});u.length?Promise.all(u).then(d):d()}return u}function eT(e,t,n={}){const i=nd(e,t,n.type==="exit"?e.presenceContext?.custom:void 0);let{transition:r=e.getDefaultTransition()||{}}=i||{};n.transitionOverride&&(r=n.transitionOverride);const o=i?()=>Promise.all(Vk(e,i,n)):()=>Promise.resolve(),s=e.variantChildren&&e.variantChildren.size?(c=0)=>{const{delayChildren:l=0,staggerChildren:u,staggerDirection:h}=r;return lGe(e,t,c,l,u,h,n)}:()=>Promise.resolve(),{when:a}=r;if(a){const[c,l]=a==="beforeChildren"?[o,s]:[s,o];return c().then(()=>l())}else return Promise.all([o(),s(n.delay)])}function lGe(e,t,n=0,i=0,r=0,o=1,s){const a=[];for(const c of e.variantChildren)c.notify("AnimationStart",t),a.push(eT(c,t,{...s,delay:n+(typeof i=="function"?0:i)+Ck(e.variantChildren,c,i,r,o)}).then(()=>c.notify("AnimationComplete",t)));return Promise.all(a)}function uGe(e,t,n={}){e.notify("AnimationStart",t);let i;if(Array.isArray(t)){const r=t.map(o=>eT(e,o,n));i=Promise.all(r)}else if(typeof t=="string")i=eT(e,t,n);else{const r=typeof t=="function"?nd(e,t,n.custom):t;i=Promise.all(Vk(e,r,n))}return i.then(()=>{e.notify("AnimationComplete",t)})}const hGe={test:e=>e==="auto",parse:e=>e},Fk=e=>t=>t.test(e),Ak=[Qh,ct,na,Yc,ZPe,XPe,hGe],zk=e=>Ak.find(Fk(e));function dGe(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||LN(e):!0}const fGe=new Set(["brightness","contrast","saturate","opacity"]);function pGe(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[i]=n.match(SE)||[];if(!i)return e;const r=n.replace(i,"");let o=fGe.has(t)?1:0;return i!==n&&(o*=100),t+"("+o+r+")"}const mGe=/\b([a-z-]*)\(.*?\)/gu,tT={...fs,getAnimatableNone:e=>{const t=e.match(mGe);return t?t.map(pGe).join(" "):e}},nT={...fs,getAnimatableNone:e=>{const t=fs.parse(e);return fs.createTransformer(e)(t.map(i=>typeof i=="number"?0:typeof i=="object"?{...i,alpha:1}:i))}},Nk={...Qh,transform:Math.round},iT={borderWidth:ct,borderTopWidth:ct,borderRightWidth:ct,borderBottomWidth:ct,borderLeftWidth:ct,borderRadius:ct,borderTopLeftRadius:ct,borderTopRightRadius:ct,borderBottomRightRadius:ct,borderBottomLeftRadius:ct,width:ct,maxWidth:ct,height:ct,maxHeight:ct,top:ct,right:ct,bottom:ct,left:ct,inset:ct,insetBlock:ct,insetBlockStart:ct,insetBlockEnd:ct,insetInline:ct,insetInlineStart:ct,insetInlineEnd:ct,padding:ct,paddingTop:ct,paddingRight:ct,paddingBottom:ct,paddingLeft:ct,paddingBlock:ct,paddingBlockStart:ct,paddingBlockEnd:ct,paddingInline:ct,paddingInlineStart:ct,paddingInlineEnd:ct,margin:ct,marginTop:ct,marginRight:ct,marginBottom:ct,marginLeft:ct,marginBlock:ct,marginBlockStart:ct,marginBlockEnd:ct,marginInline:ct,marginInlineStart:ct,marginInlineEnd:ct,fontSize:ct,backgroundPositionX:ct,backgroundPositionY:ct,...{rotate:Yc,rotateX:Yc,rotateY:Yc,rotateZ:Yc,scale:Zb,scaleX:Zb,scaleY:Zb,scaleZ:Zb,skew:Yc,skewX:Yc,skewY:Yc,distance:ct,translateX:ct,translateY:ct,translateZ:ct,x:ct,y:ct,z:ct,perspective:ct,transformPerspective:ct,opacity:y0,originX:QN,originY:QN,originZ:ct},zIndex:Nk,fillOpacity:y0,strokeOpacity:y0,numOctaves:Nk},gGe={...iT,color:li,backgroundColor:li,outlineColor:li,fill:li,stroke:li,borderColor:li,borderTopColor:li,borderRightColor:li,borderBottomColor:li,borderLeftColor:li,filter:tT,WebkitFilter:tT,mask:nT,WebkitMask:nT},kk=e=>gGe[e],yGe=new Set([tT,nT]);function Xk(e,t){let n=kk(e);return yGe.has(n)||(n=fs),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const bGe=new Set(["auto","none","0"]);function _Ge(e,t,n){let i=0,r;for(;i<e.length&&!r;){const o=e[i];typeof o=="string"&&!bGe.has(o)&&v0(o).values.length&&(r=e[i]),i++}if(r&&n)for(const o of t)e[o]=Xk(n,r)}class vGe extends BE{constructor(t,n,i,r,o){super(t,n,i,r,o,!0)}readKeyframes(){const{unresolvedKeyframes:t,element:n,name:i}=this;if(!n||!n.current)return;super.readKeyframes();for(let u=0;u<t.length;u++){let h=t[u];if(typeof h=="string"&&(h=h.trim(),xE(h))){const d=Rk(h,n.current);d!==void 0&&(t[u]=d),u===t.length-1&&(this.finalKeyframe=h)}}if(this.resolveNoneKeyframes(),!Lk.has(i)||t.length!==2)return;const[r,o]=t,s=zk(r),a=zk(o),c=KN(r),l=KN(o);if(c!==l&&Hc[i]){this.needsMeasurement=!0;return}if(s!==a)if(pk(s)&&pk(a))for(let u=0;u<t.length;u++){const h=t[u];typeof h=="string"&&(t[u]=parseFloat(h))}else Hc[i]&&(this.needsMeasurement=!0)}resolveNoneKeyframes(){const{unresolvedKeyframes:t,name:n}=this,i=[];for(let r=0;r<t.length;r++)(t[r]===null||dGe(t[r]))&&i.push(r);i.length&&_Ge(t,i,n)}measureInitialState(){const{element:t,unresolvedKeyframes:n,name:i}=this;if(!t||!t.current)return;i==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=Hc[i](t.measureViewportBox(),window.getComputedStyle(t.current)),n[0]=this.measuredOrigin;const r=n[n.length-1];r!==void 0&&t.getValue(i,r).jump(r,!1)}measureEndState(){const{element:t,name:n,unresolvedKeyframes:i}=this;if(!t||!t.current)return;const r=t.getValue(n);r&&r.jump(this.measuredOrigin,!1);const o=i.length-1,s=i[o];i[o]=Hc[n](t.measureViewportBox(),window.getComputedStyle(t.current)),s!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=s),this.removedTransforms?.length&&this.removedTransforms.forEach(([a,c])=>{t.getValue(a).set(c)}),this.resolveNoneKeyframes()}}const wGe=new Set(["opacity","clipPath","filter","transform"]);function Zk(e,t,n){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e=="string"){let i=document;const r=n?.[e]??i.querySelectorAll(e);return r?Array.from(r):[]}return Array.from(e).filter(i=>i!=null)}const Dk=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function xGe(e){return MN(e)&&"offsetHeight"in e}const{schedule:rT}=YN(queueMicrotask,!1),ps={x:!1,y:!1};function Uk(){return ps.x||ps.y}function SGe(e){return e==="x"||e==="y"?ps[e]?null:(ps[e]=!0,()=>{ps[e]=!1}):ps.x||ps.y?null:(ps.x=ps.y=!0,()=>{ps.x=ps.y=!1})}function Wk(e,t){const n=Zk(e),i=new AbortController,r={passive:!0,...t,signal:i.signal};return[n,r,()=>i.abort()]}function EGe(e){return!(e.pointerType==="touch"||Uk())}function TGe(e,t,n={}){const[i,r,o]=Wk(e,n);return i.forEach(s=>{let a=!1,c=!1,l;const u=()=>{s.removeEventListener("pointerleave",p)},h=y=>{l&&(l(y),l=void 0),u()},d=y=>{a=!1,window.removeEventListener("pointerup",d),window.removeEventListener("pointercancel",d),c&&(c=!1,h(y))},f=()=>{a=!0,window.addEventListener("pointerup",d,r),window.addEventListener("pointercancel",d,r)},p=y=>{if(y.pointerType!=="touch"){if(a){c=!0;return}h(y)}},m=y=>{if(!EGe(y))return;c=!1;const g=t(s,y);typeof g=="function"&&(l=g,s.addEventListener("pointerleave",p,r))};s.addEventListener("pointerenter",m,r),s.addEventListener("pointerdown",f,r)}),o}const Bk=(e,t)=>t?e===t?!0:Bk(e,t.parentElement):!1,oT=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,CGe=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function RGe(e){return CGe.has(e.tagName)||e.isContentEditable===!0}const IGe=new Set(["INPUT","SELECT","TEXTAREA"]);function MGe(e){return IGe.has(e.tagName)||e.isContentEditable===!0}const Bb=new WeakSet;function Yk(e){return t=>{t.key==="Enter"&&e(t)}}function sT(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const LGe=(e,t)=>{const n=e.currentTarget;if(!n)return;const i=Yk(()=>{if(Bb.has(n))return;sT(n,"down");const r=Yk(()=>{sT(n,"up")}),o=()=>sT(n,"cancel");n.addEventListener("keyup",r,t),n.addEventListener("blur",o,t)});n.addEventListener("keydown",i,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",i),t)};function Hk(e){return oT(e)&&!Uk()}const jk=new WeakSet;function PGe(e,t,n={}){const[i,r,o]=Wk(e,n),s=a=>{const c=a.currentTarget;if(!Hk(a)||jk.has(a))return;Bb.add(c),n.stopPropagation&&jk.add(a);const l=t(c,a),u=(f,p)=>{window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",d),Bb.has(c)&&Bb.delete(c),Hk(f)&&typeof l=="function"&&l(f,{success:p})},h=f=>{u(f,c===window||c===document||n.useGlobalTarget||Bk(c,f.target))},d=f=>{u(f,!1)};window.addEventListener("pointerup",h,r),window.addEventListener("pointercancel",d,r)};return i.forEach(a=>{(n.useGlobalTarget?window:a).addEventListener("pointerdown",s,r),xGe(a)&&(a.addEventListener("focus",l=>LGe(l,r)),!RGe(a)&&!a.hasAttribute("tabindex")&&(a.tabIndex=0))}),o}function aT(e){return MN(e)&&"ownerSVGElement"in e}const Yb=new WeakMap;let Hb;const Kk=(e,t,n)=>(i,r)=>r&&r[0]?r[0][e+"Size"]:aT(i)&&"getBBox"in i?i.getBBox()[t]:i[n],OGe=Kk("inline","width","offsetWidth"),GGe=Kk("block","height","offsetHeight");function VGe({target:e,borderBoxSize:t}){Yb.get(e)?.forEach(n=>{n(e,{get width(){return OGe(e,t)},get height(){return GGe(e,t)}})})}function FGe(e){e.forEach(VGe)}function AGe(){typeof ResizeObserver>"u"||(Hb=new ResizeObserver(FGe))}function zGe(e,t){Hb||AGe();const n=Zk(e);return n.forEach(i=>{let r=Yb.get(i);r||(r=new Set,Yb.set(i,r)),r.add(t),Hb?.observe(i)}),()=>{n.forEach(i=>{const r=Yb.get(i);r?.delete(t),r?.size||Hb?.unobserve(i)})}}const jb=new Set;let id;function NGe(){id=()=>{const e={get width(){return window.innerWidth},get height(){return window.innerHeight}};jb.forEach(t=>t(e))},window.addEventListener("resize",id)}function kGe(e){return jb.add(e),id||NGe(),()=>{jb.delete(e),!jb.size&&typeof id=="function"&&(window.removeEventListener("resize",id),id=void 0)}}function Jk(e,t){return typeof e=="function"?kGe(e):zGe(e,t)}function XGe(e){return aT(e)&&e.tagName==="svg"}const ZGe=[...Ak,li,fs],DGe=e=>ZGe.find(Fk(e)),Qk=()=>({translate:0,scale:1,origin:0,originPoint:0}),rd=()=>({x:Qk(),y:Qk()}),qk=()=>({min:0,max:0}),bi=()=>({x:qk(),y:qk()}),UGe=new WeakMap;function Kb(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function x0(e){return typeof e=="string"||Array.isArray(e)}const cT=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],lT=["initial",...cT];function Jb(e){return Kb(e.animate)||lT.some(t=>x0(e[t]))}function $k(e){return!!(Jb(e)||e.variants)}function WGe(e,t,n){for(const i in t){const r=t[i],o=n[i];if(tr(r))e.addValue(i,r);else if(tr(o))e.addValue(i,tu(r,{owner:e}));else if(o!==r)if(e.hasValue(i)){const s=e.getValue(i);s.liveStyle===!0?s.jump(r):s.hasAnimated||s.set(r)}else{const s=e.getStaticValue(i);e.addValue(i,tu(s!==void 0?s:r,{owner:e}))}}for(const i in n)t[i]===void 0&&e.removeValue(i);return t}const uT={current:null},eX={current:!1},BGe=typeof window<"u";function YGe(){if(eX.current=!0,!!BGe)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>uT.current=e.matches;e.addEventListener("change",t),t()}else uT.current=!1}const tX=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let Qb={};function nX(e){Qb=e}function HGe(){return Qb}class jGe{scrapeMotionValuesFromProps(t,n,i){return{}}constructor({parent:t,props:n,presenceContext:i,reducedMotionConfig:r,skipAnimations:o,blockInitialAnimation:s,visualState:a},c={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=BE,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const f=yr.now();this.renderScheduledAt<f&&(this.renderScheduledAt=f,Tn.render(this.render,!1,!0))};const{latestValues:l,renderState:u}=a;this.latestValues=l,this.baseTarget={...l},this.initialValues=n.initial?{...l}:{},this.renderState=u,this.parent=t,this.props=n,this.presenceContext=i,this.depth=t?t.depth+1:0,this.reducedMotionConfig=r,this.skipAnimationsConfig=o,this.options=c,this.blockInitialAnimation=!!s,this.isControllingVariants=Jb(n),this.isVariantNode=$k(n),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:h,...d}=this.scrapeMotionValuesFromProps(n,{},this);for(const f in d){const p=d[f];l[f]!==void 0&&tr(p)&&p.set(l[f])}}mount(t){if(this.hasBeenMounted)for(const n in this.initialValues)this.values.get(n)?.jump(this.initialValues[n]),this.latestValues[n]=this.initialValues[n];this.current=t,UGe.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((n,i)=>this.bindToMotionValue(i,n)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(eX.current||YGe(),this.shouldReduceMotion=uT.current),process.env.NODE_ENV!=="production"&&bE(this.shouldReduceMotion!==!0,"You have Reduced Motion enabled on your device. Animations may not appear as expected.","reduced-motion-disabled"),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,this.parent?.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){this.projection&&this.projection.unmount(),Bc(this.notifyUpdate),Bc(this.render),this.valueSubscriptions.forEach(t=>t()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const n=this.features[t];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(t){this.children.add(t),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(t)}removeChild(t){this.children.delete(t),this.enteringChildren&&this.enteringChildren.delete(t)}bindToMotionValue(t,n){if(this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)(),n.accelerate&&wGe.has(t)&&this.current instanceof HTMLElement){const{factory:s,keyframes:a,times:c,ease:l,duration:u}=n.accelerate,h=new Sk({element:this.current,name:t,keyframes:a,times:c,ease:l,duration:Fo(u)}),d=s(h);this.valueSubscriptions.set(t,()=>{d(),h.cancel()});return}const i=td.has(t);i&&this.onBindTransform&&this.onBindTransform();const r=n.on("change",s=>{this.latestValues[t]=s,this.props.onUpdate&&Tn.preRender(this.notifyUpdate),i&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let o;typeof window<"u"&&window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,t,n)),this.valueSubscriptions.set(t,()=>{r(),o&&o(),n.owner&&n.stop()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in Qb){const n=Qb[t];if(!n)continue;const{isEnabled:i,Feature:r}=n;if(!this.features[t]&&r&&i(this.props)&&(this.features[t]=new r(this)),this.features[t]){const o=this.features[t];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):bi()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let i=0;i<tX.length;i++){const r=tX[i];this.propEventSubscriptions[r]&&(this.propEventSubscriptions[r](),delete this.propEventSubscriptions[r]);const o="on"+r,s=t[o];s&&(this.propEventSubscriptions[r]=this.on(r,s))}this.prevMotionValues=WGe(this,this.scrapeMotionValuesFromProps(t,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(t){const n=this.getClosestVariantNode();if(n)return n.variantChildren&&n.variantChildren.add(t),()=>n.variantChildren.delete(t)}addValue(t,n){const i=this.values.get(t);n!==i&&(i&&this.removeValue(t),this.bindToMotionValue(t,n),this.values.set(t,n),this.latestValues[t]=n.get())}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let i=this.values.get(t);return i===void 0&&n!==void 0&&(i=tu(n===null?void 0:n,{owner:this}),this.addValue(t,i)),i}readValue(t,n){let i=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return i!=null&&(typeof i=="string"&&(IN(i)||LN(i))?i=parseFloat(i):!DGe(i)&&fs.test(n)&&(i=Xk(t,n)),this.setBaseTarget(t,tr(i)?i.get():i)),tr(i)?i.get():i}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){const{initial:n}=this.props;let i;if(typeof n=="string"||typeof n=="object"){const o=JE(this.props,n,this.presenceContext?.custom);o&&(i=o[t])}if(n&&i!==void 0)return i;const r=this.getBaseTargetFromProps(this.props,t);return r!==void 0&&!tr(r)?r:this.initialValues[t]!==void 0&&i===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new yE),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}scheduleRenderMicrotask(){rT.render(this.render)}}class iX extends jGe{constructor(){super(...arguments),this.KeyframeResolver=vGe}sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){const i=t.style;return i?i[n]:void 0}removeValueFromRenderState(t,{vars:n,style:i}){delete n[t],delete i[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;tr(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}class jc{constructor(t){this.isMounted=!1,this.node=t}update(){}}function rX({top:e,left:t,right:n,bottom:i}){return{x:{min:t,max:n},y:{min:e,max:i}}}function KGe({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function JGe(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),i=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:i.y,right:i.x}}function hT(e){return e===void 0||e===1}function dT({scale:e,scaleX:t,scaleY:n}){return!hT(e)||!hT(t)||!hT(n)}function nu(e){return dT(e)||oX(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function oX(e){return sX(e.x)||sX(e.y)}function sX(e){return e&&e!=="0%"}function qb(e,t,n){const i=e-n,r=t*i;return n+r}function aX(e,t,n,i,r){return r!==void 0&&(e=qb(e,r,i)),qb(e,n,i)+t}function fT(e,t=0,n=1,i,r){e.min=aX(e.min,t,n,i,r),e.max=aX(e.max,t,n,i,r)}function cX(e,{x:t,y:n}){fT(e.x,t.translate,t.scale,t.originPoint),fT(e.y,n.translate,n.scale,n.originPoint)}const lX=.999999999999,uX=1.0000000000001;function QGe(e,t,n,i=!1){const r=n.length;if(!r)return;t.x=t.y=1;let o,s;for(let a=0;a<r;a++){o=n[a],s=o.projectionDelta;const{visualElement:c}=o.options;c&&c.props.style&&c.props.style.display==="contents"||(i&&o.options.layoutScroll&&o.scroll&&o!==o.root&&sd(e,{x:-o.scroll.offset.x,y:-o.scroll.offset.y}),s&&(t.x*=s.x.scale,t.y*=s.y.scale,cX(e,s)),i&&nu(o.latestValues)&&sd(e,o.latestValues))}t.x<uX&&t.x>lX&&(t.x=1),t.y<uX&&t.y>lX&&(t.y=1)}function od(e,t){e.min=e.min+t,e.max=e.max+t}function hX(e,t,n,i,r=.5){const o=Dn(e.min,e.max,r);fT(e,t,n,o,i)}function dX(e,t){return typeof e=="string"?parseFloat(e)/100*(t.max-t.min):e}function sd(e,t){hX(e.x,dX(t.x,e.x),t.scaleX,t.scale,t.originX),hX(e.y,dX(t.y,e.y),t.scaleY,t.scale,t.originY)}function fX(e,t){return rX(JGe(e.getBoundingClientRect(),t))}function qGe(e,t,n){const i=fX(e,n),{scroll:r}=t;return r&&(od(i.x,r.offset.x),od(i.y,r.offset.y)),i}const $Ge={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},eVe=ed.length;function tVe(e,t,n){let i="",r=!0;for(let o=0;o<eVe;o++){const s=ed[o],a=e[s];if(a===void 0)continue;let c=!0;if(typeof a=="number")c=a===(s.startsWith("scale")?1:0);else{const l=parseFloat(a);c=s.startsWith("scale")?l===1:l===0}if(!c||n){const l=Dk(a,iT[s]);if(!c){r=!1;const u=$Ge[s]||s;i+=`${u}(${l}) `}n&&(t[s]=l)}}return i=i.trim(),n?i=n(t,r?"":i):r&&(i="none"),i}function pT(e,t,n){const{style:i,vars:r,transformOrigin:o}=e;let s=!1,a=!1;for(const c in t){const l=t[c];if(td.has(c)){s=!0;continue}else if(jN(c)){r[c]=l;continue}else{const u=Dk(l,iT[c]);c.startsWith("origin")?(a=!0,o[c]=u):i[c]=u}}if(t.transform||(s||n?i.transform=tVe(t,e.transform,n):i.transform&&(i.transform="none")),a){const{originX:c="50%",originY:l="50%",originZ:u=0}=o;i.transformOrigin=`${c} ${l} ${u}`}}function pX(e,{style:t,vars:n},i,r){const o=e.style;let s;for(s in t)o[s]=t[s];r?.applyProjectionStyles(o,i);for(s in n)o.setProperty(s,n[s])}function mX(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const S0={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(ct.test(e))e=parseFloat(e);else return e;const n=mX(e,t.target.x),i=mX(e,t.target.y);return`${n}% ${i}%`}},nVe={correct:(e,{treeScale:t,projectionDelta:n})=>{const i=e,r=fs.parse(e);if(r.length>5)return i;const o=fs.createTransformer(e),s=typeof r[0]!="number"?1:0,a=n.x.scale*t.x,c=n.y.scale*t.y;r[0+s]/=a,r[1+s]/=c;const l=Dn(a,c,.5);return typeof r[2+s]=="number"&&(r[2+s]/=l),typeof r[3+s]=="number"&&(r[3+s]/=l),o(r)}},mT={borderRadius:{...S0,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:S0,borderTopRightRadius:S0,borderBottomLeftRadius:S0,borderBottomRightRadius:S0,boxShadow:nVe};function gX(e,{layout:t,layoutId:n}){return td.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!mT[e]||e==="opacity")}function gT(e,t,n){const i=e.style,r=t?.style,o={};if(!i)return o;for(const s in i)(tr(i[s])||r&&tr(r[s])||gX(s,e)||n?.getValue(s)?.liveStyle!==void 0)&&(o[s]=i[s]);return o}function iVe(e){return window.getComputedStyle(e)}class rVe extends iX{constructor(){super(...arguments),this.type="html",this.renderInstance=pX}readValueFromInstance(t,n){if(td.has(n))return this.projection?.isProjecting?XE(n):EOe(t,n);{const i=iVe(t),r=(jN(n)?i.getPropertyValue(n):i[n])||0;return typeof r=="string"?r.trim():r}}measureInstanceViewportBox(t,{transformPagePoint:n}){return fX(t,n)}build(t,n,i){pT(t,n,i.transformTemplate)}scrapeMotionValuesFromProps(t,n,i){return gT(t,n,i)}}const oVe={offset:"stroke-dashoffset",array:"stroke-dasharray"},sVe={offset:"strokeDashoffset",array:"strokeDasharray"};function aVe(e,t,n=1,i=0,r=!0){e.pathLength=1;const o=r?oVe:sVe;e[o.offset]=`${-i}`,e[o.array]=`${t} ${n}`}const cVe=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function yX(e,{attrX:t,attrY:n,attrScale:i,pathLength:r,pathSpacing:o=1,pathOffset:s=0,...a},c,l,u){if(pT(e,a,l),c){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:h,style:d}=e;h.transform&&(d.transform=h.transform,delete h.transform),(d.transform||h.transformOrigin)&&(d.transformOrigin=h.transformOrigin??"50% 50%",delete h.transformOrigin),d.transform&&(d.transformBox=u?.transformBox??"fill-box",delete h.transformBox);for(const f of cVe)h[f]!==void 0&&(d[f]=h[f],delete h[f]);t!==void 0&&(h.x=t),n!==void 0&&(h.y=n),i!==void 0&&(h.scale=i),r!==void 0&&aVe(h,r,o,s,!1)}const bX=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),_X=e=>typeof e=="string"&&e.toLowerCase()==="svg";function lVe(e,t,n,i){pX(e,t,void 0,i);for(const r in t.attrs)e.setAttribute(bX.has(r)?r:$E(r),t.attrs[r])}function vX(e,t,n){const i=gT(e,t,n);for(const r in e)if(tr(e[r])||tr(t[r])){const o=ed.indexOf(r)!==-1?"attr"+r.charAt(0).toUpperCase()+r.substring(1):r;i[o]=e[r]}return i}class uVe extends iX{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=bi}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(td.has(n)){const i=kk(n);return i&&i.default||0}return n=bX.has(n)?n:$E(n),t.getAttribute(n)}scrapeMotionValuesFromProps(t,n,i){return vX(t,n,i)}build(t,n,i){yX(t,n,this.isSVGTag,i.transformTemplate,i.style)}renderInstance(t,n,i,r){lVe(t,n,i,r)}mount(t){this.isSVGTag=_X(t.tagName),super.mount(t)}}const hVe=lT.length;function wX(e){if(!e)return;if(!e.isControllingVariants){const n=e.parent?wX(e.parent)||{}:{};return e.props.initial!==void 0&&(n.initial=e.props.initial),n}const t={};for(let n=0;n<hVe;n++){const i=lT[n],r=e.props[i];(x0(r)||r===!1)&&(t[i]=r)}return t}function xX(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let i=0;i<n;i++)if(t[i]!==e[i])return!1;return!0}const dVe=[...cT].reverse(),fVe=cT.length;function pVe(e){return t=>Promise.all(t.map(({animation:n,options:i})=>uGe(e,n,i)))}function mVe(e){let t=pVe(e),n=SX(),i=!0,r=!1;const o=l=>(u,h)=>{const d=nd(e,h,l==="exit"?e.presenceContext?.custom:void 0);if(d){const{transition:f,transitionEnd:p,...m}=d;u={...u,...m,...p}}return u};function s(l){t=l(e)}function a(l){const{props:u}=e,h=wX(e.parent)||{},d=[],f=new Set;let p={},m=1/0;for(let g=0;g<fVe;g++){const v=dVe[g],S=n[v],T=u[v]!==void 0?u[v]:h[v],C=x0(T),O=v===l?S.isActive:null;O===!1&&(m=g);let V=T===h[v]&&T!==u[v]&&C;if(V&&(i||r)&&e.manuallyAnimateOnMount&&(V=!1),S.protectedKeys={...p},!S.isActive&&O===null||!T&&!S.prevProp||Kb(T)||typeof T=="boolean")continue;if(v==="exit"&&S.isActive&&O!==!0){S.prevResolvedValues&&(p={...p,...S.prevResolvedValues});continue}const A=gVe(S.prevProp,T);let G=A||v===l&&S.isActive&&!V&&C||g>m&&C,k=!1;const N=Array.isArray(T)?T:[T];let P=N.reduce(o(v),{});O===!1&&(P={});const{prevResolvedValues:w={}}=S,x={...w,...P},I=Y=>{G=!0,f.has(Y)&&(k=!0,f.delete(Y)),S.needsAnimating[Y]=!0;const H=e.getValue(Y);H&&(H.liveStyle=!1)};for(const Y in x){const H=P[Y],J=w[Y];if(p.hasOwnProperty(Y))continue;let z=!1;QE(H)&&QE(J)?z=!xX(H,J):z=H!==J,z?H!=null?I(Y):f.add(Y):H!==void 0&&f.has(Y)?I(Y):S.protectedKeys[Y]=!0}S.prevProp=T,S.prevResolvedValues=P,S.isActive&&(p={...p,...P}),(i||r)&&e.blockInitialAnimation&&(G=!1);const X=V&&A;G&&(!X||k)&&d.push(...N.map(Y=>{const H={type:v};if(typeof Y=="string"&&(i||r)&&!X&&e.manuallyAnimateOnMount&&e.parent){const{parent:J}=e,z=nd(J,Y);if(J.enteringChildren&&z){const{delayChildren:W}=z.transition||{};H.delay=Ck(J.enteringChildren,e,W)}}return{animation:Y,options:H}}))}if(f.size){const g={};if(typeof u.initial!="boolean"){const v=nd(e,Array.isArray(u.initial)?u.initial[0]:u.initial);v&&v.transition&&(g.transition=v.transition)}f.forEach(v=>{const S=e.getBaseTarget(v),T=e.getValue(v);T&&(T.liveStyle=!0),g[v]=S??null}),d.push({animation:g})}let y=!!d.length;return i&&(u.initial===!1||u.initial===u.animate)&&!e.manuallyAnimateOnMount&&(y=!1),i=!1,r=!1,y?t(d):Promise.resolve()}function c(l,u){if(n[l].isActive===u)return Promise.resolve();e.variantChildren?.forEach(d=>d.animationState?.setActive(l,u)),n[l].isActive=u;const h=a(l);for(const d in n)n[d].protectedKeys={};return h}return{animateChanges:a,setActive:c,setAnimateFunction:s,getState:()=>n,reset:()=>{n=SX(),r=!0}}}function gVe(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!xX(t,e):!1}function iu(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function SX(){return{animate:iu(!0),whileInView:iu(),whileHover:iu(),whileTap:iu(),whileDrag:iu(),whileFocus:iu(),exit:iu()}}function EX(e,t){e.min=t.min,e.max=t.max}function ms(e,t){EX(e.x,t.x),EX(e.y,t.y)}function TX(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}const CX=1e-4,yVe=1-CX,bVe=1+CX,RX=.01,_Ve=0-RX,vVe=0+RX;function br(e){return e.max-e.min}function wVe(e,t,n){return Math.abs(e-t)<=n}function IX(e,t,n,i=.5){e.origin=i,e.originPoint=Dn(t.min,t.max,e.origin),e.scale=br(n)/br(t),e.translate=Dn(n.min,n.max,e.origin)-e.originPoint,(e.scale>=yVe&&e.scale<=bVe||isNaN(e.scale))&&(e.scale=1),(e.translate>=_Ve&&e.translate<=vVe||isNaN(e.translate))&&(e.translate=0)}function E0(e,t,n,i){IX(e.x,t.x,n.x,i?i.originX:void 0),IX(e.y,t.y,n.y,i?i.originY:void 0)}function MX(e,t,n){e.min=n.min+t.min,e.max=e.min+br(t)}function xVe(e,t,n){MX(e.x,t.x,n.x),MX(e.y,t.y,n.y)}function LX(e,t,n){e.min=t.min-n.min,e.max=e.min+br(t)}function $b(e,t,n){LX(e.x,t.x,n.x),LX(e.y,t.y,n.y)}function PX(e,t,n,i,r){return e-=t,e=qb(e,1/n,i),r!==void 0&&(e=qb(e,1/r,i)),e}function SVe(e,t=0,n=1,i=.5,r,o=e,s=e){if(na.test(t)&&(t=parseFloat(t),t=Dn(s.min,s.max,t/100)-s.min),typeof t!="number")return;let a=Dn(o.min,o.max,i);e===o&&(a-=t),e.min=PX(e.min,t,n,a,r),e.max=PX(e.max,t,n,a,r)}function OX(e,t,[n,i,r],o,s){SVe(e,t[n],t[i],t[r],t.scale,o,s)}const EVe=["x","scaleX","originX"],TVe=["y","scaleY","originY"];function GX(e,t,n,i){OX(e.x,t,EVe,n?n.x:void 0,i?i.x:void 0),OX(e.y,t,TVe,n?n.y:void 0,i?i.y:void 0)}function VX(e){return e.translate===0&&e.scale===1}function FX(e){return VX(e.x)&&VX(e.y)}function AX(e,t){return e.min===t.min&&e.max===t.max}function CVe(e,t){return AX(e.x,t.x)&&AX(e.y,t.y)}function zX(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function NX(e,t){return zX(e.x,t.x)&&zX(e.y,t.y)}function kX(e){return br(e.x)/br(e.y)}function XX(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function ia(e){return[e("x"),e("y")]}function RVe(e,t,n){let i="";const r=e.x.translate/t.x,o=e.y.translate/t.y,s=n?.z||0;if((r||o||s)&&(i=`translate3d(${r}px, ${o}px, ${s}px) `),(t.x!==1||t.y!==1)&&(i+=`scale(${1/t.x}, ${1/t.y}) `),n){const{transformPerspective:l,rotate:u,rotateX:h,rotateY:d,skewX:f,skewY:p}=n;l&&(i=`perspective(${l}px) ${i}`),u&&(i+=`rotate(${u}deg) `),h&&(i+=`rotateX(${h}deg) `),d&&(i+=`rotateY(${d}deg) `),f&&(i+=`skewX(${f}deg) `),p&&(i+=`skewY(${p}deg) `)}const a=e.x.scale*t.x,c=e.y.scale*t.y;return(a!==1||c!==1)&&(i+=`scale(${a}, ${c})`),i||"none"}const ZX=["TopLeft","TopRight","BottomLeft","BottomRight"],IVe=ZX.length,DX=e=>typeof e=="string"?parseFloat(e):e,UX=e=>typeof e=="number"||ct.test(e);function MVe(e,t,n,i,r,o){r?(e.opacity=Dn(0,n.opacity??1,LVe(i)),e.opacityExit=Dn(t.opacity??1,0,PVe(i))):o&&(e.opacity=Dn(t.opacity??1,n.opacity??1,i));for(let s=0;s<IVe;s++){const a=`border${ZX[s]}Radius`;let c=WX(t,a),l=WX(n,a);if(c===void 0&&l===void 0)continue;c||(c=0),l||(l=0),c===0||l===0||UX(c)===UX(l)?(e[a]=Math.max(Dn(DX(c),DX(l),i),0),(na.test(l)||na.test(c))&&(e[a]+="%")):e[a]=l}(t.rotate||n.rotate)&&(e.rotate=Dn(t.rotate||0,n.rotate||0,i))}function WX(e,t){return e[t]!==void 0?e[t]:e.borderRadius}const LVe=BX(0,.5,XN),PVe=BX(.5,.95,Vo);function BX(e,t,n){return i=>i<e?0:i>t?1:n(m0(e,t,i))}function OVe(e,t,n){const i=tr(e)?e:tu(e);return i.start(KE("",i,t,n)),i.animation}function T0(e,t,n,i={passive:!0}){return e.addEventListener(t,n,i),()=>e.removeEventListener(t,n)}const GVe=(e,t)=>e.depth-t.depth;class VVe{constructor(){this.children=[],this.isDirty=!1}add(t){mE(this.children,t),this.isDirty=!0}remove(t){Nb(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(GVe),this.isDirty=!1,this.children.forEach(t)}}function FVe(e,t){const n=yr.now(),i=({timestamp:r})=>{const o=r-n;o>=t&&(Bc(i),e(o-t))};return Tn.setup(i,!0),()=>Bc(i)}function e1(e){return tr(e)?e.get():e}class AVe{constructor(){this.members=[]}add(t){mE(this.members,t);for(let n=this.members.length-1;n>=0;n--){const i=this.members[n];if(i===t||i===this.lead||i===this.prevLead)continue;const r=i.instance;(!r||r.isConnected===!1)&&!i.snapshot&&(Nb(this.members,i),i.unmount())}t.scheduleRender()}remove(t){if(Nb(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){for(let n=this.members.indexOf(t)-1;n>=0;n--){const i=this.members[n];if(i.isPresent!==!1&&i.instance?.isConnected!==!1)return this.promote(i),!0}return!1}promote(t,n){const i=this.lead;if(t!==i&&(this.prevLead=i,this.lead=t,t.show(),i)){i.updateSnapshot(),t.scheduleRender();const{layoutDependency:r}=i.options,{layoutDependency:o}=t.options;(r===void 0||r!==o)&&(t.resumeFrom=i,n&&(i.preserveOpacity=!0),i.snapshot&&(t.snapshot=i.snapshot,t.snapshot.latestValues=i.animationValues||i.latestValues),t.root?.isUpdating&&(t.isLayoutDirty=!0)),t.options.crossfade===!1&&i.hide()}}exitAnimationComplete(){this.members.forEach(t=>{t.options.onExitComplete?.(),t.resumingFrom?.options.onExitComplete?.()})}scheduleRender(){this.members.forEach(t=>t.instance&&t.scheduleRender(!1))}removeLeadSnapshot(){this.lead?.snapshot&&(this.lead.snapshot=void 0)}}const t1={hasAnimatedSinceResize:!0,hasEverUpdated:!1},yT=["","X","Y","Z"],zVe=1e3;let NVe=0;function bT(e,t,n,i){const{latestValues:r}=t;r[e]&&(n[e]=r[e],t.setStaticValue(e,0),i&&(i[e]=0))}function YX(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=Gk(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:r,layoutId:o}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",Tn,!(r||o))}const{parent:i}=e;i&&!i.hasCheckedOptimisedAppear&&YX(i)}function HX({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:i,resetTransform:r}){return class{constructor(s={},a=t?.()){this.id=NVe++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(ZVe),this.nodes.forEach(BVe),this.nodes.forEach(YVe),this.nodes.forEach(DVe)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=s,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let c=0;c<this.path.length;c++)this.path[c].shouldResetTransform=!0;this.root===this&&(this.nodes=new VVe)}addEventListener(s,a){return this.eventHandlers.has(s)||this.eventHandlers.set(s,new yE),this.eventHandlers.get(s).add(a)}notifyListeners(s,...a){const c=this.eventHandlers.get(s);c&&c.notify(...a)}hasListeners(s){return this.eventHandlers.has(s)}mount(s){if(this.instance)return;this.isSVG=aT(s)&&!XGe(s),this.instance=s;const{layoutId:a,layout:c,visualElement:l}=this.options;if(l&&!l.current&&l.mount(s),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(c||a)&&(this.isLayoutDirty=!0),e){let u,h=0;const d=()=>this.root.updateBlockedByResize=!1;Tn.read(()=>{h=window.innerWidth}),e(s,()=>{const f=window.innerWidth;f!==h&&(h=f,this.root.updateBlockedByResize=!0,u&&u(),u=FVe(d,250),t1.hasAnimatedSinceResize&&(t1.hasAnimatedSinceResize=!1,this.nodes.forEach(JX)))})}a&&this.root.registerSharedNode(a,this),this.options.animate!==!1&&l&&(a||c)&&this.addEventListener("didUpdate",({delta:u,hasLayoutChanged:h,hasRelativeLayoutChanged:d,layout:f})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const p=this.options.transition||l.getDefaultTransition()||QVe,{onLayoutAnimationStart:m,onLayoutAnimationComplete:y}=l.getProps(),g=!this.targetLayout||!NX(this.targetLayout,f),v=!h&&d;if(this.options.layoutRoot||this.resumeFrom||v||h&&(g||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const S={...jE(p,"layout"),onPlay:m,onComplete:y};(l.shouldReduceMotion||this.options.layoutRoot)&&(S.delay=0,S.type=!1),this.startAnimation(S),this.setAnimationOrigin(u,v)}else h||JX(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=f})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const s=this.getStack();s&&s.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Bc(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(HVe),this.animationId++)}getTransformTemplate(){const{visualElement:s}=this.options;return s&&s.getProps().transformTemplate}willUpdate(s=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&YX(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let u=0;u<this.path.length;u++){const h=this.path[u];h.shouldResetTransform=!0,h.updateScroll("snapshot"),h.options.layoutRoot&&h.willUpdate(!1)}const{layoutId:a,layout:c}=this.options;if(a===void 0&&!c)return;const l=this.getTransformTemplate();this.prevTransformTemplateValue=l?l(this.latestValues,""):void 0,this.updateSnapshot(),s&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(jX);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(KX);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach(WVe),this.nodes.forEach(kVe),this.nodes.forEach(XVe)):this.nodes.forEach(KX),this.clearAllSnapshots();const a=yr.now();zi.delta=ta(0,1e3/60,a-zi.timestamp),zi.timestamp=a,zi.isProcessing=!0,wE.update.process(zi),wE.preRender.process(zi),wE.render.process(zi),zi.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,rT.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(UVe),this.sharedNodes.forEach(jVe)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,Tn.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){Tn.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!br(this.snapshot.measuredBox.x)&&!br(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let c=0;c<this.path.length;c++)this.path[c].updateScroll();const s=this.layout;this.layout=this.measure(!1),this.layoutVersion++,this.layoutCorrected=bi(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:a}=this.options;a&&a.notify("LayoutMeasure",this.layout.layoutBox,s?s.layoutBox:void 0)}updateScroll(s="measure"){let a=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===s&&(a=!1),a&&this.instance){const c=i(this.instance);this.scroll={animationId:this.root.animationId,phase:s,isRoot:c,offset:n(this.instance),wasRoot:this.scroll?this.scroll.isRoot:c}}}resetTransform(){if(!r)return;const s=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,a=this.projectionDelta&&!FX(this.projectionDelta),c=this.getTransformTemplate(),l=c?c(this.latestValues,""):void 0,u=l!==this.prevTransformTemplateValue;s&&this.instance&&(a||nu(this.latestValues)||u)&&(r(this.instance,l),this.shouldResetTransform=!1,this.scheduleRender())}measure(s=!0){const a=this.measurePageBox();let c=this.removeElementScroll(a);return s&&(c=this.removeTransform(c)),qVe(c),{animationId:this.root.animationId,measuredBox:a,layoutBox:c,latestValues:{},source:this.id}}measurePageBox(){const{visualElement:s}=this.options;if(!s)return bi();const a=s.measureViewportBox();if(!(this.scroll?.wasRoot||this.path.some($Ve))){const{scroll:l}=this.root;l&&(od(a.x,l.offset.x),od(a.y,l.offset.y))}return a}removeElementScroll(s){const a=bi();if(ms(a,s),this.scroll?.wasRoot)return a;for(let c=0;c<this.path.length;c++){const l=this.path[c],{scroll:u,options:h}=l;l!==this.root&&u&&h.layoutScroll&&(u.wasRoot&&ms(a,s),od(a.x,u.offset.x),od(a.y,u.offset.y))}return a}applyTransform(s,a=!1){const c=bi();ms(c,s);for(let l=0;l<this.path.length;l++){const u=this.path[l];!a&&u.options.layoutScroll&&u.scroll&&u!==u.root&&sd(c,{x:-u.scroll.offset.x,y:-u.scroll.offset.y}),nu(u.latestValues)&&sd(c,u.latestValues)}return nu(this.latestValues)&&sd(c,this.latestValues),c}removeTransform(s){const a=bi();ms(a,s);for(let c=0;c<this.path.length;c++){const l=this.path[c];if(!l.instance||!nu(l.latestValues))continue;dT(l.latestValues)&&l.updateSnapshot();const u=bi(),h=l.measurePageBox();ms(u,h),GX(a,l.latestValues,l.snapshot?l.snapshot.layoutBox:void 0,u)}return nu(this.latestValues)&&GX(a,this.latestValues),a}setTargetDelta(s){this.targetDelta=s,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(s){this.options={...this.options,...s,crossfade:s.crossfade!==void 0?s.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==zi.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(s=!1){const a=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=a.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=a.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=a.isSharedProjectionDirty);const c=!!this.resumingFrom||this!==a;if(!(s||c&&this.isSharedProjectionDirty||this.isProjectionDirty||this.parent?.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;const{layout:u,layoutId:h}=this.options;if(!this.layout||!(u||h))return;this.resolvedRelativeTargetAt=zi.timestamp;const d=this.getClosestProjectingParent();d&&this.linkedParentVersion!==d.layoutVersion&&!d.options.layoutRoot&&this.removeRelativeTarget(),!this.targetDelta&&!this.relativeTarget&&(d&&d.layout?this.createRelativeTarget(d,this.layout.layoutBox,d.layout.layoutBox):this.removeRelativeTarget()),!(!this.relativeTarget&&!this.targetDelta)&&(this.target||(this.target=bi(),this.targetWithTransforms=bi()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),xVe(this.target,this.relativeTarget,this.relativeParent.target)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):ms(this.target,this.layout.layoutBox),cX(this.target,this.targetDelta)):ms(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,d&&!!d.resumingFrom==!!this.resumingFrom&&!d.options.layoutScroll&&d.target&&this.animationProgress!==1?this.createRelativeTarget(d,this.target,d.target):this.relativeParent=this.relativeTarget=void 0))}getClosestProjectingParent(){if(!(!this.parent||dT(this.parent.latestValues)||oX(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(s,a,c){this.relativeParent=s,this.linkedParentVersion=s.layoutVersion,this.forceRelativeParentToResolveTarget(),this.relativeTarget=bi(),this.relativeTargetOrigin=bi(),$b(this.relativeTargetOrigin,a,c),ms(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){const s=this.getLead(),a=!!this.resumingFrom||this!==s;let c=!0;if((this.isProjectionDirty||this.parent?.isProjectionDirty)&&(c=!1),a&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(c=!1),this.resolvedRelativeTargetAt===zi.timestamp&&(c=!1),c)return;const{layout:l,layoutId:u}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(l||u))return;ms(this.layoutCorrected,this.layout.layoutBox);const h=this.treeScale.x,d=this.treeScale.y;QGe(this.layoutCorrected,this.treeScale,this.path,a),s.layout&&!s.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(s.target=s.layout.layoutBox,s.targetWithTransforms=bi());const{target:f}=s;if(!f){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(TX(this.prevProjectionDelta.x,this.projectionDelta.x),TX(this.prevProjectionDelta.y,this.projectionDelta.y)),E0(this.projectionDelta,this.layoutCorrected,f,this.latestValues),(this.treeScale.x!==h||this.treeScale.y!==d||!XX(this.projectionDelta.x,this.prevProjectionDelta.x)||!XX(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",f))}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(s=!0){if(this.options.visualElement?.scheduleRender(),s){const a=this.getStack();a&&a.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=rd(),this.projectionDelta=rd(),this.projectionDeltaWithTransform=rd()}setAnimationOrigin(s,a=!1){const c=this.snapshot,l=c?c.latestValues:{},u={...this.latestValues},h=rd();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!a;const d=bi(),f=c?c.source:void 0,p=this.layout?this.layout.source:void 0,m=f!==p,y=this.getStack(),g=!y||y.members.length<=1,v=!!(m&&!g&&this.options.crossfade===!0&&!this.path.some(JVe));this.animationProgress=0;let S;this.mixTargetDelta=T=>{const C=T/1e3;QX(h.x,s.x,C),QX(h.y,s.y,C),this.setTargetDelta(h),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&($b(d,this.layout.layoutBox,this.relativeParent.layout.layoutBox),KVe(this.relativeTarget,this.relativeTargetOrigin,d,C),S&&CVe(this.relativeTarget,S)&&(this.isProjectionDirty=!1),S||(S=bi()),ms(S,this.relativeTarget)),m&&(this.animationValues=u,MVe(u,l,this.latestValues,C,v,g)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=C},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(s){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(Bc(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=Tn.update(()=>{t1.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=tu(0)),this.motionValue.jump(0,!1),this.currentAnimation=OVe(this.motionValue,[0,1e3],{...s,velocity:0,isSync:!0,onUpdate:a=>{this.mixTargetDelta(a),s.onUpdate&&s.onUpdate(a)},onStop:()=>{},onComplete:()=>{s.onComplete&&s.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const s=this.getStack();s&&s.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(zVe),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const s=this.getLead();let{targetWithTransforms:a,target:c,layout:l,latestValues:u}=s;if(!(!a||!c||!l)){if(this!==s&&this.layout&&l&&nZ(this.options.animationType,this.layout.layoutBox,l.layoutBox)){c=this.target||bi();const h=br(this.layout.layoutBox.x);c.x.min=s.target.x.min,c.x.max=c.x.min+h;const d=br(this.layout.layoutBox.y);c.y.min=s.target.y.min,c.y.max=c.y.min+d}ms(a,c),sd(a,u),E0(this.projectionDeltaWithTransform,this.layoutCorrected,a,u)}}registerSharedNode(s,a){this.sharedNodes.has(s)||this.sharedNodes.set(s,new AVe),this.sharedNodes.get(s).add(a);const l=a.options.initialPromotionConfig;a.promote({transition:l?l.transition:void 0,preserveFollowOpacity:l&&l.shouldPreserveFollowOpacity?l.shouldPreserveFollowOpacity(a):void 0})}isLead(){const s=this.getStack();return s?s.lead===this:!0}getLead(){const{layoutId:s}=this.options;return s?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:s}=this.options;return s?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:s}=this.options;if(s)return this.root.sharedNodes.get(s)}promote({needsReset:s,transition:a,preserveFollowOpacity:c}={}){const l=this.getStack();l&&l.promote(this,c),s&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const s=this.getStack();return s?s.relegate(this):!1}resetSkewAndRotation(){const{visualElement:s}=this.options;if(!s)return;let a=!1;const{latestValues:c}=s;if((c.z||c.rotate||c.rotateX||c.rotateY||c.rotateZ||c.skewX||c.skewY)&&(a=!0),!a)return;const l={};c.z&&bT("z",s,l,this.animationValues);for(let u=0;u<yT.length;u++)bT(`rotate${yT[u]}`,s,l,this.animationValues),bT(`skew${yT[u]}`,s,l,this.animationValues);s.render();for(const u in l)s.setStaticValue(u,l[u]),this.animationValues&&(this.animationValues[u]=l[u]);s.scheduleRender()}applyProjectionStyles(s,a){if(!this.instance||this.isSVG)return;if(!this.isVisible){s.visibility="hidden";return}const c=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,s.visibility="",s.opacity="",s.pointerEvents=e1(a?.pointerEvents)||"",s.transform=c?c(this.latestValues,""):"none";return}const l=this.getLead();if(!this.projectionDelta||!this.layout||!l.target){this.options.layoutId&&(s.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,s.pointerEvents=e1(a?.pointerEvents)||""),this.hasProjected&&!nu(this.latestValues)&&(s.transform=c?c({},""):"none",this.hasProjected=!1);return}s.visibility="";const u=l.animationValues||l.latestValues;this.applyTransformsToTarget();let h=RVe(this.projectionDeltaWithTransform,this.treeScale,u);c&&(h=c(u,h)),s.transform=h;const{x:d,y:f}=this.projectionDelta;s.transformOrigin=`${d.origin*100}% ${f.origin*100}% 0`,l.animationValues?s.opacity=l===this?u.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:u.opacityExit:s.opacity=l===this?u.opacity!==void 0?u.opacity:"":u.opacityExit!==void 0?u.opacityExit:0;for(const p in mT){if(u[p]===void 0)continue;const{correct:m,applyTo:y,isCSSVariable:g}=mT[p],v=h==="none"?u[p]:m(u[p],l);if(y){const S=y.length;for(let T=0;T<S;T++)s[y[T]]=v}else g?this.options.visualElement.renderState.vars[p]=v:s[p]=v}this.options.layoutId&&(s.pointerEvents=l===this?e1(a?.pointerEvents)||"":"none")}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(s=>s.currentAnimation?.stop()),this.root.nodes.forEach(jX),this.root.sharedNodes.clear()}}}function kVe(e){e.updateLayout()}function XVe(e){const t=e.resumeFrom?.snapshot||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:i}=e.layout,{animationType:r}=e.options,o=t.source!==e.layout.source;r==="size"?ia(u=>{const h=o?t.measuredBox[u]:t.layoutBox[u],d=br(h);h.min=n[u].min,h.max=h.min+d}):nZ(r,t.layoutBox,n)&&ia(u=>{const h=o?t.measuredBox[u]:t.layoutBox[u],d=br(n[u]);h.max=h.min+d,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[u].max=e.relativeTarget[u].min+d)});const s=rd();E0(s,n,t.layoutBox);const a=rd();o?E0(a,e.applyTransform(i,!0),t.measuredBox):E0(a,n,t.layoutBox);const c=!FX(s);let l=!1;if(!e.resumeFrom){const u=e.getClosestProjectingParent();if(u&&!u.resumeFrom){const{snapshot:h,layout:d}=u;if(h&&d){const f=bi();$b(f,t.layoutBox,h.layoutBox);const p=bi();$b(p,n,d.layoutBox),NX(f,p)||(l=!0),u.options.layoutRoot&&(e.relativeTarget=p,e.relativeTargetOrigin=f,e.relativeParent=u)}}}e.notifyListeners("didUpdate",{layout:n,snapshot:t,delta:a,layoutDelta:s,hasLayoutChanged:c,hasRelativeLayoutChanged:l})}else if(e.isLead()){const{onExitComplete:n}=e.options;n&&n()}e.options.transition=void 0}function ZVe(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function DVe(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function UVe(e){e.clearSnapshot()}function jX(e){e.clearMeasurements()}function KX(e){e.isLayoutDirty=!1}function WVe(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function JX(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function BVe(e){e.resolveTargetDelta()}function YVe(e){e.calcProjection()}function HVe(e){e.resetSkewAndRotation()}function jVe(e){e.removeLeadSnapshot()}function QX(e,t,n){e.translate=Dn(t.translate,0,n),e.scale=Dn(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function qX(e,t,n,i){e.min=Dn(t.min,n.min,i),e.max=Dn(t.max,n.max,i)}function KVe(e,t,n,i){qX(e.x,t.x,n.x,i),qX(e.y,t.y,n.y,i)}function JVe(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const QVe={duration:.45,ease:[.4,0,.1,1]},$X=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),eZ=$X("applewebkit/")&&!$X("chrome/")?Math.round:Vo;function tZ(e){e.min=eZ(e.min),e.max=eZ(e.max)}function qVe(e){tZ(e.x),tZ(e.y)}function nZ(e,t,n){return e==="position"||e==="preserve-aspect"&&!wVe(kX(t),kX(n),.2)}function $Ve(e){return e!==e.root&&e.scroll?.wasRoot}const e9e=HX({attachResizeListener:(e,t)=>T0(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body?.scrollLeft||0,y:document.documentElement.scrollTop||document.body?.scrollTop||0}),checkIsScrollRoot:()=>!0}),_T={current:void 0},iZ=HX({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!_T.current){const e=new e9e({});e.mount(window),e.setOptions({layoutScroll:!0}),_T.current=e}return _T.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),vT=R.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});function t9e(e=!0){const t=R.useContext(pE);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:i,register:r}=t,o=R.useId();R.useEffect(()=>{if(e)return r(o)},[e]);const s=R.useCallback(()=>e&&i&&i(o),[o,i,e]);return!n&&i?[!1,s]:[!0]}const rZ=R.createContext({strict:!1}),oZ={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let sZ=!1;function n9e(){if(sZ)return;const e={};for(const t in oZ)e[t]={isEnabled:n=>oZ[t].some(i=>!!n[i])};nX(e),sZ=!0}function aZ(){return n9e(),HGe()}function i9e(e){const t=aZ();for(const n in e)t[n]={...t[n],...e[n]};nX(t)}const r9e=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","propagate","ignoreStrict","viewport"]);function n1(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||r9e.has(e)}let cZ=e=>!n1(e);function o9e(e){typeof e=="function"&&(cZ=t=>t.startsWith("on")?!n1(t):e(t))}try{o9e(require("@emotion/is-prop-valid").default)}catch{}function s9e(e,t,n){const i={};for(const r in e)r==="values"&&typeof e.values=="object"||(cZ(r)||n===!0&&n1(r)||!t&&!n1(r)||e.draggable&&r.startsWith("onDrag"))&&(i[r]=e[r]);return i}const i1=R.createContext({});function a9e(e,t){if(Jb(e)){const{initial:n,animate:i}=e;return{initial:n===!1||x0(n)?n:void 0,animate:x0(i)?i:void 0}}return e.inherit!==!1?t:{}}function c9e(e){const{initial:t,animate:n}=a9e(e,R.useContext(i1));return R.useMemo(()=>({initial:t,animate:n}),[lZ(t),lZ(n)])}function lZ(e){return Array.isArray(e)?e.join(" "):e}const wT=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function uZ(e,t,n){for(const i in t)!tr(t[i])&&!gX(i,n)&&(e[i]=t[i])}function l9e({transformTemplate:e},t){return R.useMemo(()=>{const n=wT();return pT(n,t,e),Object.assign({},n.vars,n.style)},[t])}function u9e(e,t){const n=e.style||{},i={};return uZ(i,n,e),Object.assign(i,l9e(e,t)),i}function h9e(e,t){const n={},i=u9e(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,i.userSelect=i.WebkitUserSelect=i.WebkitTouchCallout="none",i.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=i,n}const hZ=()=>({...wT(),attrs:{}});function d9e(e,t,n,i){const r=R.useMemo(()=>{const o=hZ();return yX(o,t,_X(i),e.transformTemplate,e.style),{...o.attrs,style:{...o.style}}},[t]);if(e.style){const o={};uZ(o,e.style,e),r.style={...o,...r.style}}return r}const f9e=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function xT(e){return typeof e!="string"||e.includes("-")?!1:!!(f9e.indexOf(e)>-1||/[A-Z]/u.test(e))}function p9e(e,t,n,{latestValues:i},r,o=!1,s){const c=(s??xT(e)?d9e:h9e)(t,i,r,e),l=s9e(t,typeof e=="string",o),u=e!==R.Fragment?{...l,...c,ref:n}:{},{children:h}=t,d=R.useMemo(()=>tr(h)?h.get():h,[h]);return R.createElement(e,{...u,children:d})}function m9e({scrapeMotionValuesFromProps:e,createRenderState:t},n,i,r){return{latestValues:g9e(n,i,r,e),renderState:t()}}function g9e(e,t,n,i){const r={},o=i(e,{});for(const d in o)r[d]=e1(o[d]);let{initial:s,animate:a}=e;const c=Jb(e),l=$k(e);t&&l&&!c&&e.inherit!==!1&&(s===void 0&&(s=t.initial),a===void 0&&(a=t.animate));let u=n?n.initial===!1:!1;u=u||s===!1;const h=u?a:s;if(h&&typeof h!="boolean"&&!Kb(h)){const d=Array.isArray(h)?h:[h];for(let f=0;f<d.length;f++){const p=JE(e,d[f]);if(p){const{transitionEnd:m,transition:y,...g}=p;for(const v in g){let S=g[v];if(Array.isArray(S)){const T=u?S.length-1:0;S=S[T]}S!==null&&(r[v]=S)}for(const v in m)r[v]=m[v]}}}return r}const dZ=e=>(t,n)=>{const i=R.useContext(i1),r=R.useContext(pE),o=()=>m9e(e,t,i,r);return n?o():RN(o)},y9e=dZ({scrapeMotionValuesFromProps:gT,createRenderState:wT}),b9e=dZ({scrapeMotionValuesFromProps:vX,createRenderState:hZ}),_9e=Symbol.for("motionComponentSymbol");function v9e(e,t,n){const i=R.useRef(n);R.useInsertionEffect(()=>{i.current=n});const r=R.useRef(null);return R.useCallback(o=>{o&&e.onMount?.(o);const s=i.current;if(typeof s=="function")if(o){const a=s(o);typeof a=="function"&&(r.current=a)}else r.current?(r.current(),r.current=null):s(o);else s&&(s.current=o);t&&(o?t.mount(o):t.unmount())},[t])}const fZ=R.createContext({});function ad(e){return e&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function w9e(e,t,n,i,r,o){const{visualElement:s}=R.useContext(i1),a=R.useContext(rZ),c=R.useContext(pE),l=R.useContext(vT),u=l.reducedMotion,h=l.skipAnimations,d=R.useRef(null),f=R.useRef(!1);i=i||a.renderer,!d.current&&i&&(d.current=i(e,{visualState:t,parent:s,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:u,skipAnimations:h,isSVG:o}),f.current&&d.current&&(d.current.manuallyAnimateOnMount=!0));const p=d.current,m=R.useContext(fZ);p&&!p.projection&&r&&(p.type==="html"||p.type==="svg")&&x9e(d.current,n,r,m);const y=R.useRef(!1);R.useInsertionEffect(()=>{p&&y.current&&p.update(n,c)});const g=n[Ok],v=R.useRef(!!g&&typeof window<"u"&&!window.MotionHandoffIsComplete?.(g)&&window.MotionHasOptimisedAnimation?.(g));return xPe(()=>{f.current=!0,p&&(y.current=!0,window.MotionIsMounted=!0,p.updateFeatures(),p.scheduleRenderMicrotask(),v.current&&p.animationState&&p.animationState.animateChanges())}),R.useEffect(()=>{p&&(!v.current&&p.animationState&&p.animationState.animateChanges(),v.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(g)}),v.current=!1),p.enteringChildren=void 0)}),p}function x9e(e,t,n,i){const{layoutId:r,layout:o,drag:s,dragConstraints:a,layoutScroll:c,layoutRoot:l,layoutCrossfade:u}=t;e.projection=new n(e.latestValues,t["data-framer-portal-id"]?void 0:pZ(e.parent)),e.projection.setOptions({layoutId:r,layout:o,alwaysMeasureLayout:!!s||a&&ad(a),visualElement:e,animationType:typeof o=="string"?o:"both",initialPromotionConfig:i,crossfade:u,layoutScroll:c,layoutRoot:l})}function pZ(e){if(e)return e.options.allowProjection!==!1?e.projection:pZ(e.parent)}function ST(e,{forwardMotionProps:t=!1,type:n}={},i,r){i&&i9e(i);const o=n?n==="svg":xT(e),s=o?b9e:y9e;function a(l,u){let h;const d={...R.useContext(vT),...l,layoutId:S9e(l)},{isStatic:f}=d,p=c9e(l),m=s(l,f);if(!f&&typeof window<"u"){E9e(d,i);const y=T9e(d);h=y.MeasureLayout,p.visualElement=w9e(e,m,d,r,y.ProjectionNode,o)}return ce.jsxs(i1.Provider,{value:p,children:[h&&p.visualElement?ce.jsx(h,{visualElement:p.visualElement,...d}):null,p9e(e,l,v9e(m,p.visualElement,u),m,f,t,o)]})}a.displayName=`motion.${typeof e=="string"?e:`create(${e.displayName??e.name??""})`}`;const c=R.forwardRef(a);return c[_9e]=e,c}function S9e({layoutId:e}){const t=R.useContext(CN).id;return t&&e!==void 0?t+"-"+e:e}function E9e(e,t){const n=R.useContext(rZ).strict;if(process.env.NODE_ENV!=="production"&&t&&n){const i="You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.";e.ignoreStrict?Jh(!1,i,"lazy-strict-mode"):Da(!1,i,"lazy-strict-mode")}}function T9e(e){const t=aZ(),{drag:n,layout:i}=t;if(!n&&!i)return{};const r={...n,...i};return{MeasureLayout:n?.isEnabled(e)||i?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function C9e(e,t){if(typeof Proxy>"u")return ST;const n=new Map,i=(o,s)=>ST(o,s,e,t),r=(o,s)=>(process.env.NODE_ENV!=="production"&&bE(!1,"motion() is deprecated. Use motion.create() instead."),i(o,s));return new Proxy(r,{get:(o,s)=>s==="create"?i:(n.has(s)||n.set(s,ST(s,void 0,e,t)),n.get(s))})}const R9e=(e,t)=>t.isSVG??xT(e)?new uVe(t):new rVe(t,{allowProjection:e!==R.Fragment});class I9e extends jc{constructor(t){super(t),t.animationState||(t.animationState=mVe(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();Kb(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let M9e=0;class L9e extends jc{constructor(){super(...arguments),this.id=M9e++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const r=this.node.animationState.setActive("exit",!t);n&&!t&&r.then(()=>{n(this.id)})}mount(){const{register:t,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),t&&(this.unmount=t(this.id))}unmount(){}}const P9e={animation:{Feature:I9e},exit:{Feature:L9e}};function C0(e){return{point:{x:e.pageX,y:e.pageY}}}const O9e=e=>t=>oT(t)&&e(t,C0(t));function R0(e,t,n,i){return T0(e,t,O9e(n),i)}const mZ=({current:e})=>e?e.ownerDocument.defaultView:null,gZ=(e,t)=>Math.abs(e-t);function G9e(e,t){const n=gZ(e.x,t.x),i=gZ(e.y,t.y);return Math.sqrt(n**2+i**2)}const yZ=new Set(["auto","scroll"]);class bZ{constructor(t,n,{transformPagePoint:i,contextWindow:r=window,dragSnapToOrigin:o=!1,distanceThreshold:s=3,element:a}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=f=>{this.handleScroll(f.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const f=TT(this.lastMoveEventInfo,this.history),p=this.startEvent!==null,m=G9e(f.offset,{x:0,y:0})>=this.distanceThreshold;if(!p&&!m)return;const{point:y}=f,{timestamp:g}=zi;this.history.push({...y,timestamp:g});const{onStart:v,onMove:S}=this.handlers;p||(v&&v(this.lastMoveEvent,f),this.startEvent=this.lastMoveEvent),S&&S(this.lastMoveEvent,f)},this.handlePointerMove=(f,p)=>{this.lastMoveEvent=f,this.lastMoveEventInfo=ET(p,this.transformPagePoint),Tn.update(this.updatePoint,!0)},this.handlePointerUp=(f,p)=>{this.end();const{onEnd:m,onSessionEnd:y,resumeAnimation:g}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&g&&g(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const v=TT(f.type==="pointercancel"?this.lastMoveEventInfo:ET(p,this.transformPagePoint),this.history);this.startEvent&&m&&m(f,v),y&&y(f,v)},!oT(t))return;this.dragSnapToOrigin=o,this.handlers=n,this.transformPagePoint=i,this.distanceThreshold=s,this.contextWindow=r||window;const c=C0(t),l=ET(c,this.transformPagePoint),{point:u}=l,{timestamp:h}=zi;this.history=[{...u,timestamp:h}];const{onSessionStart:d}=n;d&&d(t,TT(l,this.history)),this.removeListeners=p0(R0(this.contextWindow,"pointermove",this.handlePointerMove),R0(this.contextWindow,"pointerup",this.handlePointerUp),R0(this.contextWindow,"pointercancel",this.handlePointerUp)),a&&this.startScrollTracking(a)}startScrollTracking(t){let n=t.parentElement;for(;n;){const i=getComputedStyle(n);(yZ.has(i.overflowX)||yZ.has(i.overflowY))&&this.scrollPositions.set(n,{x:n.scrollLeft,y:n.scrollTop}),n=n.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0}),window.addEventListener("scroll",this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(t){const n=this.scrollPositions.get(t);if(!n)return;const i=t===window,r=i?{x:window.scrollX,y:window.scrollY}:{x:t.scrollLeft,y:t.scrollTop},o={x:r.x-n.x,y:r.y-n.y};o.x===0&&o.y===0||(i?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=o.x,this.lastMoveEventInfo.point.y+=o.y):this.history.length>0&&(this.history[0].x-=o.x,this.history[0].y-=o.y),this.scrollPositions.set(t,r),Tn.update(this.updatePoint,!0))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Bc(this.updatePoint)}}function ET(e,t){return t?{point:t(e.point)}:e}function _Z(e,t){return{x:e.x-t.x,y:e.y-t.y}}function TT({point:e},t){return{point:e,delta:_Z(e,vZ(t)),offset:_Z(e,V9e(t)),velocity:F9e(t,.1)}}function V9e(e){return e[0]}function vZ(e){return e[e.length-1]}function F9e(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,i=null;const r=vZ(e);for(;n>=0&&(i=e[n],!(r.timestamp-i.timestamp>Fo(t)));)n--;if(!i)return{x:0,y:0};i===e[0]&&e.length>2&&r.timestamp-i.timestamp>Fo(t)*2&&(i=e[1]);const o=Ao(r.timestamp-i.timestamp);if(o===0)return{x:0,y:0};const s={x:(r.x-i.x)/o,y:(r.y-i.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function A9e(e,{min:t,max:n},i){return t!==void 0&&e<t?e=i?Dn(t,e,i.min):Math.max(e,t):n!==void 0&&e>n&&(e=i?Dn(n,e,i.max):Math.min(e,n)),e}function wZ(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function z9e(e,{top:t,left:n,bottom:i,right:r}){return{x:wZ(e.x,n,r),y:wZ(e.y,t,i)}}function xZ(e,t){let n=t.min-e.min,i=t.max-e.max;return t.max-t.min<e.max-e.min&&([n,i]=[i,n]),{min:n,max:i}}function N9e(e,t){return{x:xZ(e.x,t.x),y:xZ(e.y,t.y)}}function k9e(e,t){let n=.5;const i=br(e),r=br(t);return r>i?n=m0(t.min,t.max-i,e.min):i>r&&(n=m0(e.min,e.max-r,t.min)),ta(0,1,n)}function X9e(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const CT=.35;function Z9e(e=CT){return e===!1?e=0:e===!0&&(e=CT),{x:SZ(e,"left","right"),y:SZ(e,"top","bottom")}}function SZ(e,t,n){return{min:EZ(e,t),max:EZ(e,n)}}function EZ(e,t){return typeof e=="number"?e:e[t]||0}const D9e=new WeakMap;class U9e{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=bi(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=t}start(t,{snapToCursor:n=!1,distanceThreshold:i}={}){const{presenceContext:r}=this.visualElement;if(r&&r.isPresent===!1)return;const o=h=>{n&&this.snapToCursor(C0(h).point),this.stopAnimation()},s=(h,d)=>{const{drag:f,dragPropagation:p,onDragStart:m}=this.getProps();if(f&&!p&&(this.openDragLock&&this.openDragLock(),this.openDragLock=SGe(f),!this.openDragLock))return;this.latestPointerEvent=h,this.latestPanInfo=d,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),ia(g=>{let v=this.getAxisMotionValue(g).get()||0;if(na.test(v)){const{projection:S}=this.visualElement;if(S&&S.layout){const T=S.layout.layoutBox[g];T&&(v=br(T)*(parseFloat(v)/100))}}this.originPoint[g]=v}),m&&Tn.update(()=>m(h,d),!1,!0),qE(this.visualElement,"transform");const{animationState:y}=this.visualElement;y&&y.setActive("whileDrag",!0)},a=(h,d)=>{this.latestPointerEvent=h,this.latestPanInfo=d;const{dragPropagation:f,dragDirectionLock:p,onDirectionLock:m,onDrag:y}=this.getProps();if(!f&&!this.openDragLock)return;const{offset:g}=d;if(p&&this.currentDirection===null){this.currentDirection=B9e(g),this.currentDirection!==null&&m&&m(this.currentDirection);return}this.updateAxis("x",d.point,g),this.updateAxis("y",d.point,g),this.visualElement.render(),y&&Tn.update(()=>y(h,d),!1,!0)},c=(h,d)=>{this.latestPointerEvent=h,this.latestPanInfo=d,this.stop(h,d),this.latestPointerEvent=null,this.latestPanInfo=null},l=()=>{const{dragSnapToOrigin:h}=this.getProps();(h||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:u}=this.getProps();this.panSession=new bZ(t,{onSessionStart:o,onStart:s,onMove:a,onSessionEnd:c,resumeAnimation:l},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:u,distanceThreshold:i,contextWindow:mZ(this.visualElement),element:this.visualElement.current})}stop(t,n){const i=t||this.latestPointerEvent,r=n||this.latestPanInfo,o=this.isDragging;if(this.cancel(),!o||!r||!i)return;const{velocity:s}=r;this.startAnimation(s);const{onDragEnd:a}=this.getProps();a&&Tn.postRender(()=>a(i,r))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:i}=this.getProps();!i&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(t,n,i){const{drag:r}=this.getProps();if(!i||!r1(t,r,this.currentDirection))return;const o=this.getAxisMotionValue(t);let s=this.originPoint[t]+i[t];this.constraints&&this.constraints[t]&&(s=A9e(s,this.constraints[t],this.elastic[t])),o.set(s)}resolveConstraints(){const{dragConstraints:t,dragElastic:n}=this.getProps(),i=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,r=this.constraints;t&&ad(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&i?this.constraints=z9e(i.layoutBox,t):this.constraints=!1,this.elastic=Z9e(n),r!==this.constraints&&!ad(t)&&i&&this.constraints&&!this.hasMutatedConstraints&&ia(o=>{this.constraints!==!1&&this.getAxisMotionValue(o)&&(this.constraints[o]=X9e(i.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!ad(t))return!1;const i=t.current;Da(i!==null,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.","drag-constraints-ref");const{projection:r}=this.visualElement;if(!r||!r.layout)return!1;const o=qGe(i,r.root,this.visualElement.getTransformPagePoint());let s=N9e(r.layout.layoutBox,o);if(n){const a=n(KGe(s));this.hasMutatedConstraints=!!a,a&&(s=rX(a))}return s}startAnimation(t){const{drag:n,dragMomentum:i,dragElastic:r,dragTransition:o,dragSnapToOrigin:s,onDragTransitionEnd:a}=this.getProps(),c=this.constraints||{},l=ia(u=>{if(!r1(u,n,this.currentDirection))return;let h=c&&c[u]||{};s&&(h={min:0,max:0});const d=r?200:1e6,f=r?40:1e7,p={type:"inertia",velocity:i?t[u]:0,bounceStiffness:d,bounceDamping:f,timeConstant:750,restDelta:1,restSpeed:10,...o,...h};return this.startAxisValueAnimation(u,p)});return Promise.all(l).then(a)}startAxisValueAnimation(t,n){const i=this.getAxisMotionValue(t);return qE(this.visualElement,t),i.start(KE(t,i,0,n,this.visualElement,!1))}stopAnimation(){ia(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const n=`_drag${t.toUpperCase()}`,i=this.visualElement.getProps(),r=i[n];return r||this.visualElement.getValue(t,(i.initial?i.initial[t]:void 0)||0)}snapToCursor(t){ia(n=>{const{drag:i}=this.getProps();if(!r1(n,i,this.currentDirection))return;const{projection:r}=this.visualElement,o=this.getAxisMotionValue(n);if(r&&r.layout){const{min:s,max:a}=r.layout.layoutBox[n],c=o.get()||0;o.set(t[n]-Dn(s,a,.5)+c)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:i}=this.visualElement;if(!ad(n)||!i||!this.constraints)return;this.stopAnimation();const r={x:0,y:0};ia(s=>{const a=this.getAxisMotionValue(s);if(a&&this.constraints!==!1){const c=a.get();r[s]=k9e({min:c,max:c},this.constraints[s])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",i.root&&i.root.updateScroll(),i.updateLayout(),this.constraints=!1,this.resolveConstraints(),ia(s=>{if(!r1(s,t,null))return;const a=this.getAxisMotionValue(s),{min:c,max:l}=this.constraints[s];a.set(Dn(c,l,r[s]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;D9e.set(this.visualElement,this);const t=this.visualElement.current,n=R0(t,"pointerdown",l=>{const{drag:u,dragListener:h=!0}=this.getProps(),d=l.target,f=d!==t&&MGe(d);u&&h&&!f&&this.start(l)});let i;const r=()=>{const{dragConstraints:l}=this.getProps();ad(l)&&l.current&&(this.constraints=this.resolveRefConstraints(),i||(i=W9e(t,l.current,()=>this.scalePositionWithinConstraints())))},{projection:o}=this.visualElement,s=o.addEventListener("measure",r);o&&!o.layout&&(o.root&&o.root.updateScroll(),o.updateLayout()),Tn.read(r);const a=T0(window,"resize",()=>this.scalePositionWithinConstraints()),c=o.addEventListener("didUpdate",(({delta:l,hasLayoutChanged:u})=>{this.isDragging&&u&&(ia(h=>{const d=this.getAxisMotionValue(h);d&&(this.originPoint[h]+=l[h].translate,d.set(d.get()+l[h].translate))}),this.visualElement.render())}));return()=>{a(),n(),s(),c&&c(),i&&i()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:i=!1,dragPropagation:r=!1,dragConstraints:o=!1,dragElastic:s=CT,dragMomentum:a=!0}=t;return{...t,drag:n,dragDirectionLock:i,dragPropagation:r,dragConstraints:o,dragElastic:s,dragMomentum:a}}}function TZ(e){let t=!0;return()=>{if(t){t=!1;return}e()}}function W9e(e,t,n){const i=Jk(e,TZ(n)),r=Jk(t,TZ(n));return()=>{i(),r()}}function r1(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function B9e(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class Y9e extends jc{constructor(t){super(t),this.removeGroupControls=Vo,this.removeListeners=Vo,this.controls=new U9e(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Vo}update(){const{dragControls:t}=this.node.getProps(),{dragControls:n}=this.node.prevProps||{};t!==n&&(this.removeGroupControls(),t&&(this.removeGroupControls=t.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}}const RT=e=>(t,n)=>{e&&Tn.update(()=>e(t,n),!1,!0)};class H9e extends jc{constructor(){super(...arguments),this.removePointerDownListener=Vo}onPointerDown(t){this.session=new bZ(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:mZ(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:i,onPanEnd:r}=this.node.getProps();return{onSessionStart:RT(t),onStart:RT(n),onMove:RT(i),onEnd:(o,s)=>{delete this.session,r&&Tn.postRender(()=>r(o,s))}}}mount(){this.removePointerDownListener=R0(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let IT=!1;class j9e extends R.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:i,layoutId:r}=this.props,{projection:o}=t;o&&(n.group&&n.group.add(o),i&&i.register&&r&&i.register(o),IT&&o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),t1.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:i,drag:r,isPresent:o}=this.props,{projection:s}=i;return s&&(s.isPresent=o,t.layoutDependency!==n&&s.setOptions({...s.options,layoutDependency:n}),IT=!0,r||t.layoutDependency!==n||n===void 0||t.isPresent!==o?s.willUpdate():this.safeToRemove(),t.isPresent!==o&&(o?s.promote():s.relegate()||Tn.postRender(()=>{const a=s.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),rT.postRender(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:i}=this.props,{projection:r}=t;IT=!0,r&&(r.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(r),i&&i.deregister&&i.deregister(r))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function CZ(e){const[t,n]=t9e(),i=R.useContext(CN);return ce.jsx(j9e,{...e,layoutGroup:i,switchLayoutGroup:R.useContext(fZ),isPresent:t,safeToRemove:n})}const K9e={pan:{Feature:H9e},drag:{Feature:Y9e,ProjectionNode:iZ,MeasureLayout:CZ}};function RZ(e,t,n){const{props:i}=e;e.animationState&&i.whileHover&&e.animationState.setActive("whileHover",n==="Start");const r="onHover"+n,o=i[r];o&&Tn.postRender(()=>o(t,C0(t)))}class J9e extends jc{mount(){const{current:t}=this.node;t&&(this.unmount=TGe(t,(n,i)=>(RZ(this.node,i,"Start"),r=>RZ(this.node,r,"End"))))}unmount(){}}class Q9e extends jc{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=p0(T0(this.node.current,"focus",()=>this.onFocus()),T0(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function IZ(e,t,n){const{props:i}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&i.whileTap&&e.animationState.setActive("whileTap",n==="Start");const r="onTap"+(n==="End"?"":n),o=i[r];o&&Tn.postRender(()=>o(t,C0(t)))}class q9e extends jc{mount(){const{current:t}=this.node;if(!t)return;const{globalTapTarget:n,propagate:i}=this.node.props;this.unmount=PGe(t,(r,o)=>(IZ(this.node,o,"Start"),(s,{success:a})=>IZ(this.node,s,a?"End":"Cancel")),{useGlobalTarget:n,stopPropagation:i?.tap===!1})}unmount(){}}const MT=new WeakMap,LT=new WeakMap,$9e=e=>{const t=MT.get(e.target);t&&t(e)},eFe=e=>{e.forEach($9e)};function tFe({root:e,...t}){const n=e||document;LT.has(n)||LT.set(n,{});const i=LT.get(n),r=JSON.stringify(t);return i[r]||(i[r]=new IntersectionObserver(eFe,{root:e,...t})),i[r]}function nFe(e,t,n){const i=tFe(t);return MT.set(e,n),i.observe(e),()=>{MT.delete(e),i.unobserve(e)}}const iFe={some:0,all:1};class rFe extends jc{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:n,margin:i,amount:r="some",once:o}=t,s={root:n?n.current:void 0,rootMargin:i,threshold:typeof r=="number"?r:iFe[r]},a=c=>{const{isIntersecting:l}=c;if(this.isInView===l||(this.isInView=l,o&&!l&&this.hasEnteredView))return;l&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",l);const{onViewportEnter:u,onViewportLeave:h}=this.node.getProps(),d=l?u:h;d&&d(c)};return nFe(this.node.current,s,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(oFe(t,n))&&this.startObserver()}unmount(){}}function oFe({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const sFe={...P9e,...{inView:{Feature:rFe},tap:{Feature:q9e},focus:{Feature:Q9e},hover:{Feature:J9e}},...K9e,...{layout:{ProjectionNode:iZ,MeasureLayout:CZ}}},aFe=C9e(sFe,R9e);function MZ(e){const t=RN(()=>tu(e)),{isStatic:n}=R.useContext(vT);if(n){const[,i]=R.useState(e);R.useEffect(()=>t.on("change",i),[])}return t}function PT(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function cFe(e,t){var n=R.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(i){var r=n.value;r!==i&&(n.value=i,n.callback(i,r))}}}})[0];return n.callback=t,n.facade}var lFe=typeof window<"u"?F0.useLayoutEffect:F0.useEffect,LZ=new WeakMap;function uFe(e,t){var n=cFe(null,function(i){return e.forEach(function(r){return PT(r,i)})});return lFe(function(){var i=LZ.get(n);if(i){var r=new Set(i),o=new Set(e),s=n.current;r.forEach(function(a){o.has(a)||PT(a,null)}),o.forEach(function(a){r.has(a)||PT(a,s)})}LZ.set(n,e)},[e]),n}const hFe=new rs(rt.WGS84,b.ZERO),OT=R.forwardRef(({position:e,children:t,...n},i)=>{const r=Xo(()=>new b);e?.clone(r);const o=MZ(""),s=MZ("none"),{toWindowPosition:a,getCamera:c,toXYZ:l,isPositionVisible:u}=ai(),h=R.useRef(null);Gl(()=>{if(h.current==null)return;let f;try{const v=a?.([r.x,r.y,r.z]);f=new me(v?.[0],v?.[1])}catch{s.set("none");return}const p=c?.();if(!p)return;const m=l?.(p?.lng,p?.lat,p?.height);if(!m)return;if(hFe.cameraPosition=new b(m[0],m[1],m[2]),f==null||f.x<0||f.y<0||f.x>window.innerWidth||f.y>window.innerHeight||!u?.([r.x,r.y,r.z])){s.set("none");return}const y=`calc(${f.x}px - 50%)`,g=`calc(${f.y}px - 50%)`;o.set(`translate(${y}, ${g})`),s.set("block")});const d=uFe([h,i]);return ce.jsx(aFe.div,{ref:d,...n,style:{...n.style,transform:o,display:s,position:"absolute",pointerEvents:"none",left:0,top:0},children:t})});OT.displayName="ScreenSpaceElement";const dFe=({a:e,b:t,color:n})=>{const i=R.useRef([e,t]);i.current=[e,t];const r=Xo(()=>new yo(()=>i.current,!1)),o=R.useMemo(()=>({polyline:{positions:r,width:1.5,material:new Ol({color:n,dashLength:8})}}),[n,r]);return ce.jsx(f0,{...o})},fFe=({a:e,b:t,extrudedHeight:n,color:i,showLine:r})=>{const o=Xo(()=>new b);return ce.jsxs(ce.Fragment,{children:[ce.jsx(OT,{position:b.midpoint(e,t,o),children:ce.jsx(TN,{children:n<1e3?`${n.toFixed(1)} m`:`${(n/1e3).toFixed(1)} km`})}),r&&ce.jsx(dFe,{a:e,b:t,color:i})]})},PZ=R.memo(({geometryOptions:{controlPoints:e,type:t},extrudedHeight:n,color:i,isEditing:r,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedExtrudedPoint:c,handleControlPointMouseEvent:l})=>{const u=e[e.length-1],h=o?new b(...o):void 0,d=s?new b(...s):void 0,f=a?new b(...a):void 0;return ce.jsxs(ce.Fragment,{children:[h&&ce.jsxs(ce.Fragment,{children:[ce.jsx(d0,{index:-1,position:h,isEditing:r,isExtrudedControlPoint:!0,handleControlPointMouseEvent:l}),(!r||c)&&ce.jsx(fFe,{a:u,b:h,extrudedHeight:n,color:r?B.fromCssColorString(h0):i,showLine:t!=="extrudedPolygon"})]}),d&&ce.jsx(d0,{index:-1,position:d,isEditing:r,isExtrudedControlPoint:!0}),f&&ce.jsx(d0,{index:-1,position:f,isEditing:r,isExtrudedControlPoint:!0})]})});PZ.displayName="ExtrudedControlPoints";const pFe=({id:e,hierarchy:t,extrudedHeight:n,color:i,disableShadow:r=!1,isEditing:o})=>{const s=R.useRef(t);s.current=t;const c=Xo(()=>new yo(()=>s.current,!1)),l=R.useRef(n);l.current=n;const h=Xo(()=>new yo(()=>l.current,!1)),d=R.useMemo(()=>({polygon:{hierarchy:c,heightReference:vl.RELATIVE_TO_TERRAIN,extrudedHeight:h,extrudedHeightReference:vl.RELATIVE_TO_TERRAIN,fill:!0,outline:!0,outlineWidth:1,outlineColor:o?B.fromCssColorString(h0):i?.withAlpha(1),material:new Rl(o?i?.withAlpha(.2):i),classificationType:Kr.TERRAIN,shadows:r?Zf.DISABLED:Zf.ENABLED}}),[h,r,c,i,o]),{requestRender:f}=ai();return f?.(),ce.jsx(f0,{id:e,...d})},mFe=({dynamic:e=!1,hierarchy:t,color:n})=>{const i=R.useRef(t);i.current=t;const r=Xo(()=>new yo(()=>i.current,!1)),o=e?r:t,s=R.useMemo(()=>({polygon:{hierarchy:o,fill:!0,material:n?.withAlpha(.5),classificationType:Kr.TERRAIN}}),[n,o]),{requestRender:a}=ai();return a?.(),ce.jsx(f0,{...s})},gFe=({dynamic:e=!1,positions:t,color:n,isEditing:i})=>{const r=R.useRef(t);r.current=t;const o=Xo(()=>new yo(()=>r.current,!e)),s=e?o:t,a=R.useMemo(()=>({polyline:{positions:s,width:1.5,material:i?B.fromCssColorString(h0):n,classificationType:Kr.TERRAIN,clampToGround:!0}}),[n,s,i]),{requestRender:c}=ai();return c?.(),ce.jsx(f0,{...a})},OZ=new b,GZ=R.memo(({geometryOptions:{type:e,controlPoints:t},isEditing:n,handleAddControlPoint:i})=>{if(!["polyline","polygon","extrudedPolygon"].includes(e))return null;const r=[];for(let o=0;o<t.length-1;o++){const s=t[o+1],a=b.midpoint(t[o],s,OZ);r.push(a.clone())}if(e==="polygon"||e==="extrudedPolygon"){const o=b.midpoint(t[t.length-1],t[0],OZ);r.push(o.clone())}return ce.jsx(ce.Fragment,{children:r.map((o,s)=>ce.jsx(d0,{position:o,isAddingPoint:!0,index:s,clampToGround:!0,isEditing:n,handleControlPointMouseEvent:()=>i?.([o.x,o.y,o.z],s)},s))})});GZ.displayName="SurfaceAddingPoints";const yFe=({a:e,b:t,color:n})=>{const i=R.useRef([e,t]);i.current=[e,t];const r=Xo(()=>new yo(()=>i.current,!1)),o=R.useMemo(()=>({polyline:{positions:r,width:1.5,material:new Ol({color:n,dashLength:8}),classificationType:Kr.TERRAIN,clampToGround:!0}}),[n,r]),{requestRender:s}=ai();return s?.(),ce.jsx(f0,{...o})},bFe=({a:e,b:t,color:n,showLine:i=!1})=>{const r=Xo(()=>new b),{getSurfaceDistance:o}=ai(),s=o?.(e,t);return s!==void 0?ce.jsxs(ce.Fragment,{children:[ce.jsx(OT,{position:b.midpoint(e,t,r),children:ce.jsx(TN,{children:s<1e3?`${s.toFixed(1)} m`:`${(s/1e3).toFixed(1)} km`})}),i&&ce.jsx(yFe,{a:e,b:t,color:n})]}):null},VZ=new b,FZ=R.memo(({geometryOptions:{type:e,controlPoints:t},color:n,isEditing:i,catchedControlPointIndex:r,selectedControlPointIndex:o,handleControlPointMouseEvent:s})=>{const a=[];if(t.length>=2)if(i){if(r!==void 0&&r!==-1)switch(e){case"polyline":r>0&&a.push({points:[t[r-1],t[r]],showLine:!1}),r<t.length-1&&a.push({points:[t[r],t[r+1]],showLine:!1});break;case"circle":case"extrudedCircle":r!==2&&a.push({points:[t[0],t[1]],showLine:!0});break;case"rectangle":case"extrudedRectangle":if(r<=1)a.push({points:[t[0],t[1]],showLine:!1});else if(r===2){const[c,l,u]=t,h=b.midpoint(c,l,VZ);a.push({points:[h,u],showLine:!0})}break;case"polygon":case"extrudedPolygon":a.push({points:[t[r],r===0?t[t.length-1]:t[r-1]],showLine:!1}),a.push({points:[t[r],r===t.length-1?t[0]:t[r+1]],showLine:!1});break}}else switch(e){case"rectangle":case"extrudedRectangle":if(t.length===2)a.push({points:t,showLine:!0});else if(t.length===3){const[c,l,u]=t,h=b.midpoint(c,l,VZ);a.push({points:[h,u],showLine:!0})}break;default:a.push({points:t.slice(-2),showLine:e==="circle"});break}return ce.jsxs(ce.Fragment,{children:[t.map((c,l)=>ce.jsx(d0,{position:c,index:l,isSelected:o===l,clampToGround:!0,isEditing:i,handleControlPointMouseEvent:s},l)),a.map(({points:c,showLine:l},u)=>ce.jsx(bFe,{a:c[0],b:c[1],color:i?B.fromCssColorString(h0):n,showLine:l},u))]})});FZ.displayName="SurfaceControlPoints";const AZ=R.memo(({geometryOptions:e,extrudedHeight:t,disableShadow:n,color:i,isEditing:r,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedControlPointIndex:c,catchedExtrudedPoint:l,selectedControlPointIndex:u,handleControlPointMouseEvent:h,handleAddControlPoint:d})=>{const f=R.useMemo(()=>e?{...e,controlPoints:e?.controlPoints.map(v=>new M.Cartesian3(...v))}:null,[e]),p=R.useMemo(()=>f?yN(f):null,[f]),{positionsArray:m,hierarchyArray:y}=R.useMemo(()=>p?.type==="Point"?{}:p?.type==="LineString"?{positionsArray:uF(p)}:p!=null?{positionsArray:uF(p),hierarchyArray:hF(p)}:{},[p]),g=R.useMemo(()=>B.fromCssColorString(i??hPe),[i]);return ce.jsxs(ce.Fragment,{children:[m?.map((v,S)=>ce.jsx(gFe,{dynamic:!0,positions:v,color:g,isEditing:r},S)),y?.map((v,S)=>ce.jsx(mFe,{dynamic:!0,hierarchy:v,color:g},S)),f!=null&&(!t||r)&&ce.jsx(FZ,{geometryOptions:f,color:g,isEditing:r,catchedControlPointIndex:c,selectedControlPointIndex:u,handleControlPointMouseEvent:h}),f!=null&&r&&ce.jsx(GZ,{geometryOptions:f,isEditing:r,handleAddControlPoint:d}),f!=null&&t&&ce.jsx(PZ,{geometryOptions:f,extrudedHeight:t,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedExtrudedPoint:l,color:g,isEditing:r,handleControlPointMouseEvent:h}),t&&y?.map((v,S)=>ce.jsx(pFe,{hierarchy:v,extrudedHeight:t,disableShadow:n,color:g,isEditing:r},S))]})});AZ.displayName="SketchComponent";const _Fe=({className:e,style:t,property:n,time:i,camera:r,small:o,ready:s,children:a,selectedLayerId:c,isLayerDraggable:l,isLayerDragging:u,shouldRender:h,layerSelectionReason:d,meta:f,customProvider:p,displayCredits:m,layersRef:y,featureFlags:g,requestingRenderMode:v,timelineManagerRef:S,cameraForceHorizontalRoll:T,onLayerSelect:C,onCameraChange:O,onLayerDrag:V,onLayerDrop:A,onLayerEdit:G,onLayerSelectWithRectStart:k,onLayerSelectWithRectMove:N,onLayerSelectWithRectEnd:P,onMount:w,onLayerVisibility:x,onLayerLoad:I,onCreditsUpdate:X},D)=>{const{cesium:Y,mouseEventHandles:H,cesiumIonAccessToken:J,context:z,layerSelectWithRectEventHandlers:W,sceneLight:Q,sceneBackgroundColor:q,sceneMsaaSamples:se,sceneMode:Ce,cameraViewBoundaries:_e,cameraViewOuterBoundaries:Ve,cameraViewBoundariesMaterial:Ae,handleCameraChange:fe,handleCameraMoveEnd:Xe,handleUpdate:nt,handleClick:it,handleMount:Z,handleUnmount:pe,handleTilesChange:he,handleTerrainProviderChange:$}=QLe({ref:D,property:n,time:i,selectedLayerId:c,selectionReason:d,meta:f,customProvider:p,layersRef:y,featureFlags:g,timelineManagerRef:S,isLayerDraggable:l,isLayerDragging:u,shouldRender:h,requestingRenderMode:v,camera:r,cameraForceHorizontalRoll:T,onLayerDrag:V,onLayerDrop:A,onLayerSelect:C,onLayerEdit:G,onLayerSelectWithRectStart:k,onLayerSelectWithRectMove:N,onLayerSelectWithRectEnd:P,onLayerVisibility:x,onLayerLoad:I,onCameraChange:O,onMount:w,onCreditsUpdate:X});return ce.jsxs(gre,{ref:Y,onUpdate:nt,className:e,requestRenderMode:!0,animation:!1,timeline:!1,baseLayer:!1,fullscreenButton:!1,homeButton:!1,geocoder:!1,infoBox:!1,baseLayerPicker:!1,navigationHelpButton:!1,projectionPicker:!1,sceneModePicker:!1,creditContainer:m?void 0:vFe,style:{width:o?"300px":"auto",height:o?"300px":"100%",display:s?void 0:"none",cursor:u?"grab":void 0,...t},shadows:!!n?.scene?.shadow?.enabled,onClick:it,onDoubleClick:H.doubleClick,onMouseDown:H.mouseDown,onMouseUp:H.mouseUp,onRightClick:H.rightClick,onRightDown:H.rightDown,onRightUp:H.rightUp,onMiddleClick:H.middleClick,onMiddleDown:H.middleDown,onMiddleUp:H.middleUp,onMouseMove:H.mouseMove,onMouseEnter:H.mouseEnter,onMouseLeave:H.mouseLeave,onWheel:H.wheel,automaticallyTrackDataSourceClocks:!1,children:[ce.jsx(zbe,{onMount:Z,onUnmount:pe}),ce.jsx(Zoe,{timelineManagerRef:S}),ce.jsx(Yye,{tiles:n?.tiles,cesiumIonAccessToken:J,customProvider:p,onTilesChange:he}),ce.jsx(mF,{tileLabels:n?.tileLabels}),ce.jsx(Kye,{property:n,timelineManagerRef:S}),ce.jsxs(kM,{useDefault:!0,children:[ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_CLICK}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOUBLE_CLICK})]}),ce.jsxs(kM,{children:[ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOWN,action:W.start.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOWN,modifier:M.KeyboardEventModifier.SHIFT,action:W.start.shift}),ce.jsx(hc,{type:M.ScreenSpaceEventType.MOUSE_MOVE,action:W.move.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.MOUSE_MOVE,modifier:M.KeyboardEventModifier.SHIFT,action:W.move.shift}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_UP,action:W.end.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_UP,modifier:M.KeyboardEventModifier.SHIFT,action:W.end.shift})]}),ce.jsx(ore,{maximumZoomDistance:n?.camera?.limiter?.enabled?n.camera?.limiter?.targetArea?.height??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!n?.camera?.allowEnterGround}),ce.jsx(kne,{percentageChanged:.2,onChange:fe,onMoveEnd:Xe}),_e&&n?.camera?.limiter?.showHelper&&ce.jsx(uc,{children:ce.jsx(ml,{positions:_e,width:1,material:M.Color.RED,arcType:M.ArcType.RHUMB})}),Ve&&n?.camera?.limiter?.showHelper&&ce.jsx(uc,{children:ce.jsx(ml,{positions:Ve,width:1,material:Ae,arcType:M.ArcType.RHUMB})}),ce.jsx(ire,{backgroundColor:q,light:Q,mode:Ce,msaaSamples:se,useDepthPicking:!0,useWebVR:!!n?.scene?.vr||void 0,debugShowFramesPerSecond:!!n?.debug?.showFramesPerSecond,verticalExaggerationRelativeHeight:n?.scene?.verticalExaggerationRelativeHeight,verticalExaggeration:n?.scene?.verticalExaggeration}),ce.jsx(lre,{show:n?.sky?.skyBox?.show??!0}),ce.jsx(fie,{enabled:n?.sky?.fog?.enabled??!0,density:n?.sky?.fog?.density}),ce.jsx(hre,{show:n?.sky?.sun?.show??!0}),ce.jsx(kie,{show:n?.sky?.moon?.show??!0}),ce.jsx(are,{show:n?.sky?.skyAtmosphere?.show??!0,atmosphereLightIntensity:n?.sky?.skyAtmosphere?.lightIntensity,saturationShift:n?.sky?.skyAtmosphere?.saturationShift,brightnessShift:n?.sky?.skyAtmosphere?.brightnessShift}),ce.jsx(wse,{property:n,cesiumIonAccessToken:J,onTerrainProviderChange:$}),ce.jsx(EF.Provider,{value:z,children:s?a:null}),ce.jsx(lPe,{...uPe[n?.render?.ambientOcclusion?.quality||"low"],enabled:!!n?.render?.ambientOcclusion?.enabled,intensity:n?.render?.ambientOcclusion?.intensity??100,outputType:n?.render?.ambientOcclusion?.ambientOcclusionOnly?SN.Occlusion:null})]})},vFe=document.createElement("div"),zZ={cesium:{component:R.forwardRef(_Fe),featureComponent:G5e,clusterComponent:Xoe,sketchComponent:AZ,delegatedDataTypes:["czml","wms","mvt","3dtiles","osm-buildings","reearth-buildings","google-photorealistic","kml"]}};function wFe({error:e,resetErrorBoundary:t}){const i=e?.message??String(e);return ce.jsxs("div",{children:[ce.jsx("h1",{children:"Oops! An Error Occurred"}),ce.jsx("p",{children:i}),ce.jsx("p",{children:ce.jsx("button",{style:{color:"#fff"},onClick:t,children:"Retry"})})]})}const xFe="0.0.7-alpha.64",SFe=({viewerProperty:e})=>{const t=R.useRef(e);t.current=e;const n=R.useMemo(()=>({get version(){return xFe},get viewerProperty(){return t.current}}),[]);R.useEffect(()=>{window.reearth_core=n},[n])},EFe=768,TFe=({wrapperRef:e})=>{const t=R.useMemo(()=>CFe(new URLSearchParams(window.location.search)),[]),[n,i]=R.useState({width:void 0,height:void 0,isMobile:void 0,query:t});return R.useEffect(()=>{const r=new ResizeObserver(o=>{const[s]=o;let a,c;if(s.contentBoxSize){const l=Array.isArray(s.contentBoxSize)?s.contentBoxSize[0]:s.contentBoxSize;a=l.inlineSize,c=l.blockSize}else s.contentRect?(a=s.contentRect.width,c=s.contentRect.height):(a=e.current?.clientWidth,c=e.current?.clientHeight);i(l=>({width:a,height:c,isMobile:a?a<=EFe:void 0,query:l.query}))});return e.current&&r.observe(e.current),()=>{r.disconnect()}},[e]),n};function CFe(e){const t={};for(const[n,i]of e)t[n]=i;return t}function RFe({camera:e,interactionMode:t,zoomedLayerId:n,viewerProperty:i,onLayerSelect:r,onCameraChange:o,onInteractionModeChange:s,onZoomToLayer:a,onLayerDrop:c,onSketchTypeChangeProp:l},u){const h=R.useRef(null);R.useImperativeHandle(u,()=>h.current,[]);const d=R.useRef(null),f=TFe({wrapperRef:d}),[p,m]=R.useState({}),[y,g]=R.useState(),[v,S]=R.useState(),T=R.useCallback(async(Be,St,Dt,Et,$e)=>{const xt=p.layer?.layer?.type==="simple"&&p.layer?.layer?.data?.isSketchLayer;if(p.layerId===Be&&p.featureId===St&&!xt)return;const mn=await Dt?.(),kn=Be&&St?(xt?mn?.features?.find(Jn=>Jn.id===St):h.current?.engine.findComputedFeatureById?.(Be,St))??$e?.feature:void 0;g(Be&&St?h.current?.engine.findFeatureById?.(Be,St):void 0),S(kn),m(Jn=>Jn.layerId===Be&&Jn.featureId===St?Jn:{layerId:Be,featureId:St,layer:mn,reason:Et}),r?.(Be,Dt,kn,Et)},[p,r]),C=R.useRef(void 0),[O,V]=NZ(e,o),[A,G]=R.useState(!1),k=R.useCallback(Be=>{G(!!Be)},[]),[N,P]=NZ(t||"default",s);R.useEffect(()=>{N==="default"&&h?.current?.engine?.setCursor("auto")},[N]);const w=z0[N??"default"],x=R.useRef(void 0),I=R.useCallback(Be=>{x.current=Be},[]),X=R.useCallback(Be=>{x.current?.(Be)},[]),D=R.useRef(void 0),Y=R.useCallback(Be=>{D.current=Be},[]),H=R.useCallback(Be=>{D.current?.(Be)},[]),J=R.useRef(void 0),z=R.useCallback(Be=>{J.current=Be},[]),W=R.useCallback(Be=>{J.current?.(Be)},[]),Q=R.useRef(void 0),q=R.useCallback(Be=>{Q.current=Be},[]),se=R.useCallback(Be=>{Q.current?.(Be)},[]),Ce=R.useRef(void 0),_e=R.useCallback(Be=>{Ce.current=Be},[]),Ve=R.useCallback(Be=>{Ce.current?.(Be)},[]),Ae=R.useRef(void 0),fe=R.useCallback(Be=>{Ae.current=Be},[]),Xe=R.useCallback(Be=>{Ae.current?.(Be)},[]),nt=R.useRef([]),it=R.useCallback(Be=>{nt.current.push(Be)},[]),Z=R.useCallback(Be=>{nt.current.forEach(St=>St(Be))},[]),pe=R.useRef([]),he=R.useCallback(Be=>{pe.current.push(Be)},[]),$=R.useCallback(Be=>{pe.current.forEach(St=>St(Be))},[]),j=R.useRef([]),ee=R.useCallback(Be=>{j.current.push(Be)},[]),le=R.useCallback(Be=>{j.current.forEach(St=>St(Be))},[]),ge=R.useRef([]),te=R.useCallback(Be=>{ge.current.push(Be)},[]),ue=R.useCallback((Be,St)=>{ge.current.forEach(Dt=>Dt(Be)),l?.(Be,St)},[l]);R.useEffect(()=>{n&&(h.current?.engine?.lookAtLayer(n),a?.(void 0))},[n,a]);const[Re,ye]=R.useState(!1),Ue=R.useCallback(()=>{ye(!0)},[]),We=R.useCallback((Be,St,Dt)=>{ye(!1);const Et=h.current?.layers.findById(Be),$e=Et?.property.default.location?"default.location":Et?.property.default.position?"default.position":void 0;Dt&&Et&&Et.propertyId&&$e&&c?.(Et.propertyId,$e,Dt)},[c,h]),qe=R.useMemo(()=>({interactionMode:N,selectedLayer:p,selectedComputedFeature:v,viewport:f,handleCameraForceHorizontalRollChange:k,handleInteractionModeChange:P,onSketchPluginFeatureCreate:it,onSketchPluginFeatureUpdate:he,onSketchPluginFeatureDelete:ee,onSketchTypeChange:te,onLayerVisibility:Y,onLayerLoad:z,onLayerEdit:I,onLayerSelectWithRectStart:q,onLayerSelectWithRectMove:_e,onLayerSelectWithRectEnd:fe}),[N,p,v,f,P,k,I,it,he,ee,te,Y,z,q,_e,fe]),Xt=R.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return SFe({viewerProperty:i}),{mapRef:h,wrapperRef:d,selectedFeature:y,camera:O,featureFlags:w,isLayerDragging:Re,timelineManagerRef:C,cameraForceHorizontalRoll:A,coreContextValue:qe,containerStyle:Xt,overriddenInteractionMode:N,handleLayerSelect:T,handleLayerDrag:Ue,handleLayerDrop:We,handleLayerEdit:X,handleCameraChange:V,handleInteractionModeChange:P,handleSketchPluginFeatureCreate:Z,handleSketchPluginFeatureUpdate:$,handleSketchPluginFeatureDelete:le,handleSketchTypeChange:ue,handleLayerVisibility:H,handleLayerLoad:W,handleLayerSelectWithRectStart:se,handleLayerSelectWithRectMove:Ve,handleLayerSelectWithRectEnd:Xe}}function NZ(e,t){const[n,i]=R.useState(e),r=R.useCallback(o=>{o&&(i(o),t?.(o))},[t]);return R.useEffect(()=>{i(e)},[e]),[n,r]}const IFe=R.memo(R.forwardRef(({engine:e,isBuilt:t,isEditable:n,viewerProperty:i,layers:r,clusters:o,small:s,ready:a,hiddenLayers:c,camera:l,time:u,interactionMode:h,shouldRender:d,meta:f,customProvider:p,displayCredits:m=!0,style:y,zoomedLayerId:g,children:v,onLayerDrop:S,onLayerSelect:T,onCameraChange:C,onZoomToLayer:O,onInteractionModeChange:V,onMount:A,onSketchTypeChangeProp:G,onSketchFeatureCreate:k,onSketchFeatureUpdate:N,onSketchFeatureDelete:P,onAPIReady:w,onCreditsUpdate:x},I)=>{const{mapRef:X,wrapperRef:D,selectedFeature:Y,camera:H,featureFlags:J,isLayerDragging:z,timelineManagerRef:W,cameraForceHorizontalRoll:Q,coreContextValue:q,containerStyle:se,overriddenInteractionMode:Ce,handleLayerSelect:_e,handleLayerDrag:Ve,handleLayerDrop:Ae,handleLayerEdit:fe,handleCameraChange:Xe,handleInteractionModeChange:nt,handleSketchPluginFeatureCreate:it,handleSketchPluginFeatureUpdate:Z,handleSketchPluginFeatureDelete:pe,handleSketchTypeChange:he,handleLayerVisibility:$,handleLayerLoad:j,handleLayerSelectWithRectStart:ee,handleLayerSelectWithRectMove:le,handleLayerSelectWithRectEnd:ge}=RFe({camera:l,interactionMode:h,zoomedLayerId:g,viewerProperty:i,onLayerSelect:T,onCameraChange:C,onZoomToLayer:O,onLayerDrop:S,onInteractionModeChange:V,onSketchTypeChangeProp:G},I);return ce.jsx(Foe,{FallbackComponent:wFe,children:ce.jsx(koe,{mapRef:X,children:ce.jsxs("div",{ref:D,style:se,children:[ce.jsx(d5,{ref:X,isBuilt:t,isEditable:n,engine:e,layers:r,engines:zZ,camera:H,cameraForceHorizontalRoll:Q,clusters:o,hiddenLayers:c,isLayerDragging:z,isLayerDraggable:n,meta:f,customProvider:p,displayCredits:m,style:y,featureFlags:J,shouldRender:d,property:i,time:u,small:s,ready:a,timelineManagerRef:W,interactionMode:Ce,selectedFeature:Y,onCameraChange:Xe,onLayerDrag:Ve,onLayerDrop:Ae,onLayerSelect:_e,onLayerEdit:fe,overrideInteractionMode:nt,onSketchFeatureCreate:k,onSketchPluginFeatureCreate:it,onSketchFeatureUpdate:N,onSketchPluginFeatureUpdate:Z,onSketchFeatureDelete:P,onSketchPluginFeatureDelete:pe,onSketchTypeChange:he,onMount:A,onLayerVisibility:$,onLayerLoad:j,onLayerSelectWithRectStart:ee,onLayerSelectWithRectMove:le,onLayerSelectWithRectEnd:ge,onAPIReady:w,onCreditsUpdate:x}),ce.jsx(p5.Provider,{value:q,children:v})]})})})}));var cd=typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{},ra=[],zo=[],MFe=typeof Uint8Array<"u"?Uint8Array:Array,GT=!1;function kZ(){GT=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,n=e.length;t<n;++t)ra[t]=e[t],zo[e.charCodeAt(t)]=t;zo[45]=62,zo[95]=63}function LFe(e){GT||kZ();var t,n,i,r,o,s,a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o=e[a-2]==="="?2:e[a-1]==="="?1:0,s=new MFe(a*3/4-o),i=o>0?a-4:a;var c=0;for(t=0,n=0;t<i;t+=4,n+=3)r=zo[e.charCodeAt(t)]<<18|zo[e.charCodeAt(t+1)]<<12|zo[e.charCodeAt(t+2)]<<6|zo[e.charCodeAt(t+3)],s[c++]=r>>16&255,s[c++]=r>>8&255,s[c++]=r&255;return o===2?(r=zo[e.charCodeAt(t)]<<2|zo[e.charCodeAt(t+1)]>>4,s[c++]=r&255):o===1&&(r=zo[e.charCodeAt(t)]<<10|zo[e.charCodeAt(t+1)]<<4|zo[e.charCodeAt(t+2)]>>2,s[c++]=r>>8&255,s[c++]=r&255),s}function PFe(e){return ra[e>>18&63]+ra[e>>12&63]+ra[e>>6&63]+ra[e&63]}function OFe(e,t,n){for(var i,r=[],o=t;o<n;o+=3)i=(e[o]<<16)+(e[o+1]<<8)+e[o+2],r.push(PFe(i));return r.join("")}function XZ(e){GT||kZ();for(var t,n=e.length,i=n%3,r="",o=[],s=16383,a=0,c=n-i;a<c;a+=s)o.push(OFe(e,a,a+s>c?c:a+s));return i===1?(t=e[n-1],r+=ra[t>>2],r+=ra[t<<4&63],r+="=="):i===2&&(t=(e[n-2]<<8)+e[n-1],r+=ra[t>>10],r+=ra[t>>4&63],r+=ra[t<<2&63],r+="="),o.push(r),o.join("")}function o1(e,t,n,i,r){var o,s,a=r*8-i-1,c=(1<<a)-1,l=c>>1,u=-7,h=n?r-1:0,d=n?-1:1,f=e[t+h];for(h+=d,o=f&(1<<-u)-1,f>>=-u,u+=a;u>0;o=o*256+e[t+h],h+=d,u-=8);for(s=o&(1<<-u)-1,o>>=-u,u+=i;u>0;s=s*256+e[t+h],h+=d,u-=8);if(o===0)o=1-l;else{if(o===c)return s?NaN:(f?-1:1)*(1/0);s=s+Math.pow(2,i),o=o-l}return(f?-1:1)*s*Math.pow(2,o-i)}function ZZ(e,t,n,i,r,o){var s,a,c,l=o*8-r-1,u=(1<<l)-1,h=u>>1,d=r===23?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:o-1,p=i?1:-1,m=t<0||t===0&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=u):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),s+h>=1?t+=d/c:t+=d*Math.pow(2,1-h),t*c>=2&&(s++,c/=2),s+h>=u?(a=0,s=u):s+h>=1?(a=(t*c-1)*Math.pow(2,r),s=s+h):(a=t*Math.pow(2,h-1)*Math.pow(2,r),s=0));r>=8;e[n+f]=a&255,f+=p,a/=256,r-=8);for(s=s<<r|a,l+=r;l>0;e[n+f]=s&255,f+=p,s/=256,l-=8);e[n+f-p]|=m*128}var GFe={}.toString,DZ=Array.isArray||function(e){return GFe.call(e)=="[object Array]"},VFe=50;ve.TYPED_ARRAY_SUPPORT=cd.TYPED_ARRAY_SUPPORT!==void 0?cd.TYPED_ARRAY_SUPPORT:!0,s1();function s1(){return ve.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Wa(e,t){if(s1()<t)throw new RangeError("Invalid typed array length");return ve.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t),e.__proto__=ve.prototype):(e===null&&(e=new ve(t)),e.length=t),e}function ve(e,t,n){if(!ve.TYPED_ARRAY_SUPPORT&&!(this instanceof ve))return new ve(e,t,n);if(typeof e=="number"){if(typeof t=="string")throw new Error("If encoding is specified then the first argument must be a string");return VT(this,e)}return UZ(this,e,t,n)}ve.poolSize=8192,ve._augment=function(e){return e.__proto__=ve.prototype,e};function UZ(e,t,n,i){if(typeof t=="number")throw new TypeError('"value" argument must not be a number');return typeof ArrayBuffer<"u"&&t instanceof ArrayBuffer?zFe(e,t,n,i):typeof t=="string"?AFe(e,t,n):NFe(e,t)}ve.from=function(e,t,n){return UZ(null,e,t,n)},ve.TYPED_ARRAY_SUPPORT&&(ve.prototype.__proto__=Uint8Array.prototype,ve.__proto__=Uint8Array,typeof Symbol<"u"&&Symbol.species&&ve[Symbol.species]);function WZ(e){if(typeof e!="number")throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function FFe(e,t,n,i){return WZ(t),t<=0?Wa(e,t):n!==void 0?typeof i=="string"?Wa(e,t).fill(n,i):Wa(e,t).fill(n):Wa(e,t)}ve.alloc=function(e,t,n){return FFe(null,e,t,n)};function VT(e,t){if(WZ(t),e=Wa(e,t<0?0:AT(t)|0),!ve.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}ve.allocUnsafe=function(e){return VT(null,e)},ve.allocUnsafeSlow=function(e){return VT(null,e)};function AFe(e,t,n){if((typeof n!="string"||n==="")&&(n="utf8"),!ve.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var i=BZ(t,n)|0;e=Wa(e,i);var r=e.write(t,n);return r!==i&&(e=e.slice(0,r)),e}function FT(e,t){var n=t.length<0?0:AT(t.length)|0;e=Wa(e,n);for(var i=0;i<n;i+=1)e[i]=t[i]&255;return e}function zFe(e,t,n,i){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError("'offset' is out of bounds");if(t.byteLength<n+(i||0))throw new RangeError("'length' is out of bounds");return n===void 0&&i===void 0?t=new Uint8Array(t):i===void 0?t=new Uint8Array(t,n):t=new Uint8Array(t,n,i),ve.TYPED_ARRAY_SUPPORT?(e=t,e.__proto__=ve.prototype):e=FT(e,t),e}function NFe(e,t){if(oa(t)){var n=AT(t.length)|0;return e=Wa(e,n),e.length===0||t.copy(e,0,0,n),e}if(t){if(typeof ArrayBuffer<"u"&&t.buffer instanceof ArrayBuffer||"length"in t)return typeof t.length!="number"||i4e(t.length)?Wa(e,0):FT(e,t);if(t.type==="Buffer"&&DZ(t.data))return FT(e,t.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function AT(e){if(e>=s1())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s1().toString(16)+" bytes");return e|0}ve.isBuffer=Wr;function oa(e){return!!(e!=null&&e._isBuffer)}ve.compare=function(t,n){if(!oa(t)||!oa(n))throw new TypeError("Arguments must be Buffers");if(t===n)return 0;for(var i=t.length,r=n.length,o=0,s=Math.min(i,r);o<s;++o)if(t[o]!==n[o]){i=t[o],r=n[o];break}return i<r?-1:r<i?1:0},ve.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},ve.concat=function(t,n){if(!DZ(t))throw new TypeError('"list" argument must be an Array of Buffers');if(t.length===0)return ve.alloc(0);var i;if(n===void 0)for(n=0,i=0;i<t.length;++i)n+=t[i].length;var r=ve.allocUnsafe(n),o=0;for(i=0;i<t.length;++i){var s=t[i];if(!oa(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(r,o),o+=s.length}return r};function BZ(e,t){if(oa(e))return e.length;if(typeof ArrayBuffer<"u"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;typeof e!="string"&&(e=""+e);var n=e.length;if(n===0)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return l1(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return n*2;case"hex":return n>>>1;case"base64":return eD(e).length;default:if(i)return l1(e).length;t=(""+t).toLowerCase(),i=!0}}ve.byteLength=BZ;function kFe(e,t,n){var i=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((n===void 0||n>this.length)&&(n=this.length),n<=0)||(n>>>=0,t>>>=0,n<=t))return"";for(e||(e="utf8");;)switch(e){case"hex":return KFe(this,t,n);case"utf8":case"utf-8":return KZ(this,t,n);case"ascii":return HFe(this,t,n);case"latin1":case"binary":return jFe(this,t,n);case"base64":return BFe(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return JFe(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}ve.prototype._isBuffer=!0;function ru(e,t,n){var i=e[t];e[t]=e[n],e[n]=i}ve.prototype.swap16=function(){var t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var n=0;n<t;n+=2)ru(this,n,n+1);return this},ve.prototype.swap32=function(){var t=this.length;if(t%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var n=0;n<t;n+=4)ru(this,n,n+3),ru(this,n+1,n+2);return this},ve.prototype.swap64=function(){var t=this.length;if(t%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var n=0;n<t;n+=8)ru(this,n,n+7),ru(this,n+1,n+6),ru(this,n+2,n+5),ru(this,n+3,n+4);return this},ve.prototype.toString=function(){var t=this.length|0;return t===0?"":arguments.length===0?KZ(this,0,t):kFe.apply(this,arguments)},ve.prototype.equals=function(t){if(!oa(t))throw new TypeError("Argument must be a Buffer");return this===t?!0:ve.compare(this,t)===0},ve.prototype.inspect=function(){var t="",n=VFe;return this.length>0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),"<Buffer "+t+">"},ve.prototype.compare=function(t,n,i,r,o){if(!oa(t))throw new TypeError("Argument must be a Buffer");if(n===void 0&&(n=0),i===void 0&&(i=t?t.length:0),r===void 0&&(r=0),o===void 0&&(o=this.length),n<0||i>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&n>=i)return 0;if(r>=o)return-1;if(n>=i)return 1;if(n>>>=0,i>>>=0,r>>>=0,o>>>=0,this===t)return 0;for(var s=o-r,a=i-n,c=Math.min(s,a),l=this.slice(r,o),u=t.slice(n,i),h=0;h<c;++h)if(l[h]!==u[h]){s=l[h],a=u[h];break}return s<a?-1:a<s?1:0};function YZ(e,t,n,i,r){if(e.length===0)return-1;if(typeof n=="string"?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0)if(r)n=0;else return-1;if(typeof t=="string"&&(t=ve.from(t,i)),oa(t))return t.length===0?-1:HZ(e,t,n,i,r);if(typeof t=="number")return t=t&255,ve.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):HZ(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function HZ(e,t,n,i,r){var o=1,s=e.length,a=t.length;if(i!==void 0&&(i=String(i).toLowerCase(),i==="ucs2"||i==="ucs-2"||i==="utf16le"||i==="utf-16le")){if(e.length<2||t.length<2)return-1;o=2,s/=2,a/=2,n/=2}function c(f,p){return o===1?f[p]:f.readUInt16BE(p*o)}var l;if(r){var u=-1;for(l=n;l<s;l++)if(c(e,l)===c(t,u===-1?0:l-u)){if(u===-1&&(u=l),l-u+1===a)return u*o}else u!==-1&&(l-=l-u),u=-1}else for(n+a>s&&(n=s-a),l=n;l>=0;l--){for(var h=!0,d=0;d<a;d++)if(c(e,l+d)!==c(t,d)){h=!1;break}if(h)return l}return-1}ve.prototype.includes=function(t,n,i){return this.indexOf(t,n,i)!==-1},ve.prototype.indexOf=function(t,n,i){return YZ(this,t,n,i,!0)},ve.prototype.lastIndexOf=function(t,n,i){return YZ(this,t,n,i,!1)};function XFe(e,t,n,i){n=Number(n)||0;var r=e.length-n;i?(i=Number(i),i>r&&(i=r)):i=r;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var s=0;s<i;++s){var a=parseInt(t.substr(s*2,2),16);if(isNaN(a))return s;e[n+s]=a}return s}function ZFe(e,t,n,i){return u1(l1(t,e.length-n),e,n,i)}function jZ(e,t,n,i){return u1(t4e(t),e,n,i)}function DFe(e,t,n,i){return jZ(e,t,n,i)}function UFe(e,t,n,i){return u1(eD(t),e,n,i)}function WFe(e,t,n,i){return u1(n4e(t,e.length-n),e,n,i)}ve.prototype.write=function(t,n,i,r){if(n===void 0)r="utf8",i=this.length,n=0;else if(i===void 0&&typeof n=="string")r=n,i=this.length,n=0;else if(isFinite(n))n=n|0,isFinite(i)?(i=i|0,r===void 0&&(r="utf8")):(r=i,i=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var o=this.length-n;if((i===void 0||i>o)&&(i=o),t.length>0&&(i<0||n<0)||n>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var s=!1;;)switch(r){case"hex":return XFe(this,t,n,i);case"utf8":case"utf-8":return ZFe(this,t,n,i);case"ascii":return jZ(this,t,n,i);case"latin1":case"binary":return DFe(this,t,n,i);case"base64":return UFe(this,t,n,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return WFe(this,t,n,i);default:if(s)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),s=!0}},ve.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function BFe(e,t,n){return t===0&&n===e.length?XZ(e):XZ(e.slice(t,n))}function KZ(e,t,n){n=Math.min(e.length,n);for(var i=[],r=t;r<n;){var o=e[r],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r+a<=n){var c,l,u,h;switch(a){case 1:o<128&&(s=o);break;case 2:c=e[r+1],(c&192)===128&&(h=(o&31)<<6|c&63,h>127&&(s=h));break;case 3:c=e[r+1],l=e[r+2],(c&192)===128&&(l&192)===128&&(h=(o&15)<<12|(c&63)<<6|l&63,h>2047&&(h<55296||h>57343)&&(s=h));break;case 4:c=e[r+1],l=e[r+2],u=e[r+3],(c&192)===128&&(l&192)===128&&(u&192)===128&&(h=(o&15)<<18|(c&63)<<12|(l&63)<<6|u&63,h>65535&&h<1114112&&(s=h))}}s===null?(s=65533,a=1):s>65535&&(s-=65536,i.push(s>>>10&1023|55296),s=56320|s&1023),i.push(s),r+=a}return YFe(i)}var JZ=4096;function YFe(e){var t=e.length;if(t<=JZ)return String.fromCharCode.apply(String,e);for(var n="",i=0;i<t;)n+=String.fromCharCode.apply(String,e.slice(i,i+=JZ));return n}function HFe(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;r<n;++r)i+=String.fromCharCode(e[r]&127);return i}function jFe(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;r<n;++r)i+=String.fromCharCode(e[r]);return i}function KFe(e,t,n){var i=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>i)&&(n=i);for(var r="",o=t;o<n;++o)r+=e4e(e[o]);return r}function JFe(e,t,n){for(var i=e.slice(t,n),r="",o=0;o<i.length;o+=2)r+=String.fromCharCode(i[o]+i[o+1]*256);return r}ve.prototype.slice=function(t,n){var i=this.length;t=~~t,n=n===void 0?i:~~n,t<0?(t+=i,t<0&&(t=0)):t>i&&(t=i),n<0?(n+=i,n<0&&(n=0)):n>i&&(n=i),n<t&&(n=t);var r;if(ve.TYPED_ARRAY_SUPPORT)r=this.subarray(t,n),r.__proto__=ve.prototype;else{var o=n-t;r=new ve(o,void 0);for(var s=0;s<o;++s)r[s]=this[s+t]}return r};function Ri(e,t,n){if(e%1!==0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}ve.prototype.readUIntLE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t],o=1,s=0;++s<n&&(o*=256);)r+=this[t+s]*o;return r},ve.prototype.readUIntBE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t+--n],o=1;n>0&&(o*=256);)r+=this[t+--n]*o;return r},ve.prototype.readUInt8=function(t,n){return n||Ri(t,1,this.length),this[t]},ve.prototype.readUInt16LE=function(t,n){return n||Ri(t,2,this.length),this[t]|this[t+1]<<8},ve.prototype.readUInt16BE=function(t,n){return n||Ri(t,2,this.length),this[t]<<8|this[t+1]},ve.prototype.readUInt32LE=function(t,n){return n||Ri(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},ve.prototype.readUInt32BE=function(t,n){return n||Ri(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ve.prototype.readIntLE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t],o=1,s=0;++s<n&&(o*=256);)r+=this[t+s]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*n)),r},ve.prototype.readIntBE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=n,o=1,s=this[t+--r];r>0&&(o*=256);)s+=this[t+--r]*o;return o*=128,s>=o&&(s-=Math.pow(2,8*n)),s},ve.prototype.readInt8=function(t,n){return n||Ri(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},ve.prototype.readInt16LE=function(t,n){n||Ri(t,2,this.length);var i=this[t]|this[t+1]<<8;return i&32768?i|4294901760:i},ve.prototype.readInt16BE=function(t,n){n||Ri(t,2,this.length);var i=this[t+1]|this[t]<<8;return i&32768?i|4294901760:i},ve.prototype.readInt32LE=function(t,n){return n||Ri(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ve.prototype.readInt32BE=function(t,n){return n||Ri(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ve.prototype.readFloatLE=function(t,n){return n||Ri(t,4,this.length),o1(this,t,!0,23,4)},ve.prototype.readFloatBE=function(t,n){return n||Ri(t,4,this.length),o1(this,t,!1,23,4)},ve.prototype.readDoubleLE=function(t,n){return n||Ri(t,8,this.length),o1(this,t,!0,52,8)},ve.prototype.readDoubleBE=function(t,n){return n||Ri(t,8,this.length),o1(this,t,!1,52,8)};function Ur(e,t,n,i,r,o){if(!oa(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||t<o)throw new RangeError('"value" argument is out of bounds');if(n+i>e.length)throw new RangeError("Index out of range")}ve.prototype.writeUIntLE=function(t,n,i,r){if(t=+t,n=n|0,i=i|0,!r){var o=Math.pow(2,8*i)-1;Ur(this,t,n,i,o,0)}var s=1,a=0;for(this[n]=t&255;++a<i&&(s*=256);)this[n+a]=t/s&255;return n+i},ve.prototype.writeUIntBE=function(t,n,i,r){if(t=+t,n=n|0,i=i|0,!r){var o=Math.pow(2,8*i)-1;Ur(this,t,n,i,o,0)}var s=i-1,a=1;for(this[n+s]=t&255;--s>=0&&(a*=256);)this[n+s]=t/a&255;return n+i},ve.prototype.writeUInt8=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,1,255,0),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[n]=t&255,n+1};function a1(e,t,n,i){t<0&&(t=65535+t+1);for(var r=0,o=Math.min(e.length-n,2);r<o;++r)e[n+r]=(t&255<<8*(i?r:1-r))>>>(i?r:1-r)*8}ve.prototype.writeUInt16LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8):a1(this,t,n,!0),n+2},ve.prototype.writeUInt16BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>8,this[n+1]=t&255):a1(this,t,n,!1),n+2};function c1(e,t,n,i){t<0&&(t=4294967295+t+1);for(var r=0,o=Math.min(e.length-n,4);r<o;++r)e[n+r]=t>>>(i?r:3-r)*8&255}ve.prototype.writeUInt32LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[n+3]=t>>>24,this[n+2]=t>>>16,this[n+1]=t>>>8,this[n]=t&255):c1(this,t,n,!0),n+4},ve.prototype.writeUInt32BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>24,this[n+1]=t>>>16,this[n+2]=t>>>8,this[n+3]=t&255):c1(this,t,n,!1),n+4},ve.prototype.writeIntLE=function(t,n,i,r){if(t=+t,n=n|0,!r){var o=Math.pow(2,8*i-1);Ur(this,t,n,i,o-1,-o)}var s=0,a=1,c=0;for(this[n]=t&255;++s<i&&(a*=256);)t<0&&c===0&&this[n+s-1]!==0&&(c=1),this[n+s]=(t/a>>0)-c&255;return n+i},ve.prototype.writeIntBE=function(t,n,i,r){if(t=+t,n=n|0,!r){var o=Math.pow(2,8*i-1);Ur(this,t,n,i,o-1,-o)}var s=i-1,a=1,c=0;for(this[n+s]=t&255;--s>=0&&(a*=256);)t<0&&c===0&&this[n+s+1]!==0&&(c=1),this[n+s]=(t/a>>0)-c&255;return n+i},ve.prototype.writeInt8=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,1,127,-128),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[n]=t&255,n+1},ve.prototype.writeInt16LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8):a1(this,t,n,!0),n+2},ve.prototype.writeInt16BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>8,this[n+1]=t&255):a1(this,t,n,!1),n+2},ve.prototype.writeInt32LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,2147483647,-2147483648),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8,this[n+2]=t>>>16,this[n+3]=t>>>24):c1(this,t,n,!0),n+4},ve.prototype.writeInt32BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>24,this[n+1]=t>>>16,this[n+2]=t>>>8,this[n+3]=t&255):c1(this,t,n,!1),n+4};function QZ(e,t,n,i,r,o){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function qZ(e,t,n,i,r){return r||QZ(e,t,n,4),ZZ(e,t,n,i,23,4),n+4}ve.prototype.writeFloatLE=function(t,n,i){return qZ(this,t,n,!0,i)},ve.prototype.writeFloatBE=function(t,n,i){return qZ(this,t,n,!1,i)};function $Z(e,t,n,i,r){return r||QZ(e,t,n,8),ZZ(e,t,n,i,52,8),n+8}ve.prototype.writeDoubleLE=function(t,n,i){return $Z(this,t,n,!0,i)},ve.prototype.writeDoubleBE=function(t,n,i){return $Z(this,t,n,!1,i)},ve.prototype.copy=function(t,n,i,r){if(i||(i=0),!r&&r!==0&&(r=this.length),n>=t.length&&(n=t.length),n||(n=0),r>0&&r<i&&(r=i),r===i||t.length===0||this.length===0)return 0;if(n<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-n<r-i&&(r=t.length-n+i);var o=r-i,s;if(this===t&&i<n&&n<r)for(s=o-1;s>=0;--s)t[s+n]=this[s+i];else if(o<1e3||!ve.TYPED_ARRAY_SUPPORT)for(s=0;s<o;++s)t[s+n]=this[s+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),n);return o},ve.prototype.fill=function(t,n,i,r){if(typeof t=="string"){if(typeof n=="string"?(r=n,n=0,i=this.length):typeof i=="string"&&(r=i,i=this.length),t.length===1){var o=t.charCodeAt(0);o<256&&(t=o)}if(r!==void 0&&typeof r!="string")throw new TypeError("encoding must be a string");if(typeof r=="string"&&!ve.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else typeof t=="number"&&(t=t&255);if(n<0||this.length<n||this.length<i)throw new RangeError("Out of range index");if(i<=n)return this;n=n>>>0,i=i===void 0?this.length:i>>>0,t||(t=0);var s;if(typeof t=="number")for(s=n;s<i;++s)this[s]=t;else{var a=oa(t)?t:l1(new ve(t,r).toString()),c=a.length;for(s=0;s<i-n;++s)this[s+n]=a[s%c]}return this};var QFe=/[^+\/0-9A-Za-z-_]/g;function qFe(e){if(e=$Fe(e).replace(QFe,""),e.length<2)return"";for(;e.length%4!==0;)e=e+"=";return e}function $Fe(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function e4e(e){return e<16?"0"+e.toString(16):e.toString(16)}function l1(e,t){t=t||1/0;for(var n,i=e.length,r=null,o=[],s=0;s<i;++s){if(n=e.charCodeAt(s),n>55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}else if(s+1===i){(t-=3)>-1&&o.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),r=n;continue}n=(r-55296<<10|n-56320)+65536}else r&&(t-=3)>-1&&o.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,n&63|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,n&63|128)}else if(n<1114112){if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,n&63|128)}else throw new Error("Invalid code point")}return o}function t4e(e){for(var t=[],n=0;n<e.length;++n)t.push(e.charCodeAt(n)&255);return t}function n4e(e,t){for(var n,i,r,o=[],s=0;s<e.length&&!((t-=2)<0);++s)n=e.charCodeAt(s),i=n>>8,r=n%256,o.push(r),o.push(i);return o}function eD(e){return LFe(qFe(e))}function u1(e,t,n,i){for(var r=0;r<i&&!(r+n>=t.length||r>=e.length);++r)t[r+n]=e[r];return r}function i4e(e){return e!==e}function Wr(e){return e!=null&&(!!e._isBuffer||tD(e)||r4e(e))}function tD(e){return!!e.constructor&&typeof e.constructor.isBuffer=="function"&&e.constructor.isBuffer(e)}function r4e(e){return typeof e.readFloatLE=="function"&&typeof e.slice=="function"&&tD(e.slice(0,0))}var zT;function Kc(){}Kc.prototype=Object.create(null);function Bt(){Bt.init.call(this)}Bt.EventEmitter=Bt,Bt.usingDomains=!1,Bt.prototype.domain=void 0,Bt.prototype._events=void 0,Bt.prototype._maxListeners=void 0,Bt.defaultMaxListeners=10,Bt.init=function(){this.domain=null,Bt.usingDomains&&zT.active&&!(this instanceof zT.Domain)&&(this.domain=zT.active),(!this._events||this._events===Object.getPrototypeOf(this)._events)&&(this._events=new Kc,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},Bt.prototype.setMaxListeners=function(t){if(typeof t!="number"||t<0||isNaN(t))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=t,this};function nD(e){return e._maxListeners===void 0?Bt.defaultMaxListeners:e._maxListeners}Bt.prototype.getMaxListeners=function(){return nD(this)};function o4e(e,t,n){if(t)e.call(n);else for(var i=e.length,r=I0(e,i),o=0;o<i;++o)r[o].call(n)}function s4e(e,t,n,i){if(t)e.call(n,i);else for(var r=e.length,o=I0(e,r),s=0;s<r;++s)o[s].call(n,i)}function a4e(e,t,n,i,r){if(t)e.call(n,i,r);else for(var o=e.length,s=I0(e,o),a=0;a<o;++a)s[a].call(n,i,r)}function c4e(e,t,n,i,r,o){if(t)e.call(n,i,r,o);else for(var s=e.length,a=I0(e,s),c=0;c<s;++c)a[c].call(n,i,r,o)}function l4e(e,t,n,i){if(t)e.apply(n,i);else for(var r=e.length,o=I0(e,r),s=0;s<r;++s)o[s].apply(n,i)}Bt.prototype.emit=function(t){var n,i,r,o,s,a,c,l=t==="error";if(a=this._events,a)l=l&&a.error==null;else if(!l)return!1;if(c=this.domain,l){if(n=arguments[1],c)n||(n=new Error('Uncaught, unspecified "error" event')),n.domainEmitter=this,n.domain=c,n.domainThrown=!1,c.emit("error",n);else{if(n instanceof Error)throw n;var u=new Error('Uncaught, unspecified "error" event. ('+n+")");throw u.context=n,u}return!1}if(i=a[t],!i)return!1;var h=typeof i=="function";switch(r=arguments.length,r){case 1:o4e(i,h,this);break;case 2:s4e(i,h,this,arguments[1]);break;case 3:a4e(i,h,this,arguments[1],arguments[2]);break;case 4:c4e(i,h,this,arguments[1],arguments[2],arguments[3]);break;default:for(o=new Array(r-1),s=1;s<r;s++)o[s-1]=arguments[s];l4e(i,h,this,o)}return!0};function iD(e,t,n,i){var r,o,s;if(typeof n!="function")throw new TypeError('"listener" argument must be a function');if(o=e._events,o?(o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]):(o=e._events=new Kc,e._eventsCount=0),!s)s=o[t]=n,++e._eventsCount;else if(typeof s=="function"?s=o[t]=i?[n,s]:[s,n]:i?s.unshift(n):s.push(n),!s.warned&&(r=nD(e),r&&r>0&&s.length>r)){s.warned=!0;var a=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");a.name="MaxListenersExceededWarning",a.emitter=e,a.type=t,a.count=s.length,u4e(a)}return e}function u4e(e){typeof console.warn=="function"?console.warn(e):console.log(e)}Bt.prototype.addListener=function(t,n){return iD(this,t,n,!1)},Bt.prototype.on=Bt.prototype.addListener,Bt.prototype.prependListener=function(t,n){return iD(this,t,n,!0)};function rD(e,t,n){var i=!1;function r(){e.removeListener(t,r),i||(i=!0,n.apply(e,arguments))}return r.listener=n,r}Bt.prototype.once=function(t,n){if(typeof n!="function")throw new TypeError('"listener" argument must be a function');return this.on(t,rD(this,t,n)),this},Bt.prototype.prependOnceListener=function(t,n){if(typeof n!="function")throw new TypeError('"listener" argument must be a function');return this.prependListener(t,rD(this,t,n)),this},Bt.prototype.removeListener=function(t,n){var i,r,o,s,a;if(typeof n!="function")throw new TypeError('"listener" argument must be a function');if(r=this._events,!r)return this;if(i=r[t],!i)return this;if(i===n||i.listener&&i.listener===n)--this._eventsCount===0?this._events=new Kc:(delete r[t],r.removeListener&&this.emit("removeListener",t,i.listener||n));else if(typeof i!="function"){for(o=-1,s=i.length;s-- >0;)if(i[s]===n||i[s].listener&&i[s].listener===n){a=i[s].listener,o=s;break}if(o<0)return this;if(i.length===1){if(i[0]=void 0,--this._eventsCount===0)return this._events=new Kc,this;delete r[t]}else h4e(i,o);r.removeListener&&this.emit("removeListener",t,a||n)}return this},Bt.prototype.removeAllListeners=function(t){var n,i;if(i=this._events,!i)return this;if(!i.removeListener)return arguments.length===0?(this._events=new Kc,this._eventsCount=0):i[t]&&(--this._eventsCount===0?this._events=new Kc:delete i[t]),this;if(arguments.length===0){for(var r=Object.keys(i),o=0,s;o<r.length;++o)s=r[o],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=new Kc,this._eventsCount=0,this}if(n=i[t],typeof n=="function")this.removeListener(t,n);else if(n)do this.removeListener(t,n[n.length-1]);while(n[0]);return this},Bt.prototype.listeners=function(t){var n,i,r=this._events;return r?(n=r[t],n?typeof n=="function"?i=[n.listener||n]:i=d4e(n):i=[]):i=[],i},Bt.listenerCount=function(e,t){return typeof e.listenerCount=="function"?e.listenerCount(t):oD.call(e,t)},Bt.prototype.listenerCount=oD;function oD(e){var t=this._events;if(t){var n=t[e];if(typeof n=="function")return 1;if(n)return n.length}return 0}Bt.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};function h4e(e,t){for(var n=t,i=n+1,r=e.length;i<r;n+=1,i+=1)e[n]=e[i];e.pop()}function I0(e,t){for(var n=new Array(t);t--;)n[t]=e[t];return n}function d4e(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}function sD(){throw new Error("setTimeout has not been defined")}function aD(){throw new Error("clearTimeout has not been defined")}var Jc=sD,Qc=aD;typeof cd.setTimeout=="function"&&(Jc=setTimeout),typeof cd.clearTimeout=="function"&&(Qc=clearTimeout);function cD(e){if(Jc===setTimeout)return setTimeout(e,0);if((Jc===sD||!Jc)&&setTimeout)return Jc=setTimeout,setTimeout(e,0);try{return Jc(e,0)}catch{try{return Jc.call(null,e,0)}catch{return Jc.call(this,e,0)}}}function f4e(e){if(Qc===clearTimeout)return clearTimeout(e);if((Qc===aD||!Qc)&&clearTimeout)return Qc=clearTimeout,clearTimeout(e);try{return Qc(e)}catch{try{return Qc.call(null,e)}catch{return Qc.call(this,e)}}}var Ba=[],ld=!1,ou,h1=-1;function p4e(){!ld||!ou||(ld=!1,ou.length?Ba=ou.concat(Ba):h1=-1,Ba.length&&lD())}function lD(){if(!ld){var e=cD(p4e);ld=!0;for(var t=Ba.length;t;){for(ou=Ba,Ba=[];++h1<t;)ou&&ou[h1].run();h1=-1,t=Ba.length}ou=null,ld=!1,f4e(e)}}function No(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];Ba.push(new uD(e,t)),Ba.length===1&&!ld&&cD(lD)}function uD(e,t){this.fun=e,this.array=t}uD.prototype.run=function(){this.fun.apply(null,this.array)};var m4e={},M0=cd.performance||{};M0.now||M0.mozNow||M0.msNow||M0.oNow||M0.webkitNow;var d1={env:m4e},NT;typeof Object.create=="function"?NT=function(t,n){t.super_=n,t.prototype=Object.create(n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:NT=function(t,n){t.super_=n;var i=function(){};i.prototype=n.prototype,t.prototype=new i,t.prototype.constructor=t};var ud=NT,g4e=/%[sdj%]/g;function y4e(e){if(!UT(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(qc(arguments[n]));return t.join(" ")}for(var n=1,i=arguments,r=i.length,o=String(e).replace(g4e,function(a){if(a==="%%")return"%";if(n>=r)return a;switch(a){case"%s":return String(i[n++]);case"%d":return Number(i[n++]);case"%j":try{return JSON.stringify(i[n++])}catch{return"[Circular]"}default:return a}}),s=i[n];n<r;s=i[++n])DT(s)||!L0(s)?o+=" "+s:o+=" "+qc(s);return o}function hD(e,t){if($c(cd.process))return function(){return hD(e,t).apply(this,arguments)};if(d1.noDeprecation===!0)return e;var n=!1;function i(){if(!n){if(d1.throwDeprecation)throw new Error(t);d1.traceDeprecation?console.trace(t):console.error(t),n=!0}return e.apply(this,arguments)}return i}var f1={},kT;function b4e(e){if($c(kT)&&(kT=d1.env.NODE_DEBUG||""),e=e.toUpperCase(),!f1[e])if(new RegExp("\\b"+e+"\\b","i").test(kT)){var t=0;f1[e]=function(){var n=y4e.apply(null,arguments);console.error("%s %d: %s",e,t,n)}}else f1[e]=function(){};return f1[e]}function qc(e,t){var n={seen:[],stylize:v4e};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),dD(t)?n.showHidden=t:t&&R4e(n,t),$c(n.showHidden)&&(n.showHidden=!1),$c(n.depth)&&(n.depth=2),$c(n.colors)&&(n.colors=!1),$c(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=_4e),p1(n,e,n.depth)}qc.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},qc.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function _4e(e,t){var n=qc.styles[t];return n?"\x1B["+qc.colors[n][0]+"m"+e+"\x1B["+qc.colors[n][1]+"m":e}function v4e(e,t){return e}function w4e(e){var t={};return e.forEach(function(n,i){t[n]=!0}),t}function p1(e,t,n){if(e.customInspect&&t&&YT(t.inspect)&&t.inspect!==qc&&!(t.constructor&&t.constructor.prototype===t)){var i=t.inspect(n,e);return UT(i)||(i=p1(e,i,n)),i}var r=x4e(e,t);if(r)return r;var o=Object.keys(t),s=w4e(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),BT(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return XT(t);if(o.length===0){if(YT(t)){var a=t.name?": "+t.name:"";return e.stylize("[Function"+a+"]","special")}if(WT(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(fD(t))return e.stylize(Date.prototype.toString.call(t),"date");if(BT(t))return XT(t)}var c="",l=!1,u=["{","}"];if(T4e(t)&&(l=!0,u=["[","]"]),YT(t)){var h=t.name?": "+t.name:"";c=" [Function"+h+"]"}if(WT(t)&&(c=" "+RegExp.prototype.toString.call(t)),fD(t)&&(c=" "+Date.prototype.toUTCString.call(t)),BT(t)&&(c=" "+XT(t)),o.length===0&&(!l||t.length==0))return u[0]+c+u[1];if(n<0)return WT(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var d;return l?d=S4e(e,t,n,s,o):d=o.map(function(f){return ZT(e,t,n,s,f,l)}),e.seen.pop(),E4e(d,c,u)}function x4e(e,t){if($c(t))return e.stylize("undefined","undefined");if(UT(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}if(C4e(t))return e.stylize(""+t,"number");if(dD(t))return e.stylize(""+t,"boolean");if(DT(t))return e.stylize("null","null")}function XT(e){return"["+Error.prototype.toString.call(e)+"]"}function S4e(e,t,n,i,r){for(var o=[],s=0,a=t.length;s<a;++s)pD(t,String(s))?o.push(ZT(e,t,n,i,String(s),!0)):o.push("");return r.forEach(function(c){c.match(/^\d+$/)||o.push(ZT(e,t,n,i,c,!0))}),o}function ZT(e,t,n,i,r,o){var s,a,c;if(c=Object.getOwnPropertyDescriptor(t,r)||{value:t[r]},c.get?c.set?a=e.stylize("[Getter/Setter]","special"):a=e.stylize("[Getter]","special"):c.set&&(a=e.stylize("[Setter]","special")),pD(i,r)||(s="["+r+"]"),a||(e.seen.indexOf(c.value)<0?(DT(n)?a=p1(e,c.value,null):a=p1(e,c.value,n-1),a.indexOf(`
6731
+ `,uniforms:{...Yr(u,["color","frustumLength","blackPoint","whitePoint","gamma"]),globeDepthTexture:()=>c?.()??d._depthTexture}});if(r){const f=ePe({prefix:e,outputType:s,useGlobeDepth:a,getGlobeDepthTexture:c,uniforms:{textureScale:t,...Yr(u,["frustumLength","normalExponent","depthExponent"])}}),p=new M.PostProcessStageComposite({name:`${e}_ambient_occlusion_generate_and_filter`,stages:[h,f]});return d.uniforms.ambientOcclusionTexture=p.name,new M.PostProcessStageComposite({name:`${e}_ambient_occlusion`,stages:[p,d],inputPreviousStageTexture:!1,uniforms:fE([{stage:h,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:f,uniforms:["frustumLength","normalExponent","depthExponent"]},{stage:d,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}else return d.uniforms.ambientOcclusionTexture=h.name,new M.PostProcessStageComposite({name:`${e}_ambient_occlusion`,stages:[h,d],inputPreviousStageTexture:!1,uniforms:fE([{stage:h,uniforms:["intensity","maxRadius","bias","frustumLength","focalLength"]},{stage:d,uniforms:["color","blackPoint","whitePoint","gamma"]}])})}const cPe=({enabled:e=!0,textureScale:t,directions:n,steps:i,denoise:r,accurateNormalReconstruction:o,outputType:s,useGlobeDepth:a,...c})=>{const{viewer:l}=$n(),u=l?.scene,h=fF({owner:u?.postProcessStages,keys:[t,i,n,r,o,s,a],create:()=>{const d=aPe({textureScale:t,steps:i,directions:n,denoise:r,accurateNormalReconstruction:o,outputType:s,useGlobeDepth:a,getGlobeDepthTexture:()=>u.context.uniformState.globeDepthTexture,uniforms:c});return d.enabled=e,d},transferOwnership:(d,f)=>(f?.add(d),()=>{f?.remove(d)})});return h.enabled=e,Object.assign(h.uniforms,c),u?.requestRender(),Gl(()=>{const d=u?.camera.frustum;if(d instanceof M.PerspectiveFrustum&&d.fovy!==void 0&&d.aspectRatio!==void 0){const f=1/Math.tan(d.fovy/2);h.uniforms.focalLength.x=f*d.aspectRatio,h.uniforms.focalLength.y=f}}),null},lPe=e=>{const t=$n(),[n,i]=R.useState(!1);return Gl(()=>{const r=t.scene;i(!r?.globe.depthTestAgainstTerrain);const{globeHeight:o}=r;if(!r||o==null)return;const s=r.camera.positionCartographic.height-o,a=r?.camera.frustum;a instanceof M.PerspectiveFrustum&&a.fov!==void 0&&(r.camera.frustum.near=M.Math.clamp(s-1,1,5)/Math.tan(a.fov/2))}),ce.jsx(cPe,{...e,useGlobeDepth:n})};var SN=(e=>(e[e.Occlusion=1]="Occlusion",e[e.Normal=2]="Normal",e[e.Depth=3]="Depth",e[e.Weight=4]="Weight",e[e.Shade=5]="Shade",e))(SN||{});const uPe={low:{directions:4,steps:4,textureScale:.5,maxRadius:30},medium:{directions:4,steps:8,textureScale:.5,maxRadius:40},high:{directions:8,steps:8,textureScale:1,maxRadius:40},extreme:{directions:16,steps:16,textureScale:1,maxRadius:40}},hPe="#00bebe",h0="#3B3CD0",dPe="#FF9900",fPe="#3B3CD0";let Jl,pPe,mPe,Ql;const d0=({position:e,clampToGround:t=!1,index:n,isEditing:i,isSelected:r,isAddingPoint:o,isExtrudedControlPoint:s,handleControlPointMouseEvent:a})=>{const c=R.useRef(e);c.current=e;const l=Xo(()=>new yo((f,p)=>"getValue"in c.current?c.current.getValue(f,p):c.current,!1)),u=R.useMemo(()=>({position:l,billboard:{image:i?o?_Pe():r?bPe():yPe():gPe(),width:i?16:8,height:i?16:8,heightReference:t?vl.CLAMP_TO_GROUND:vl.NONE,disableDepthTestDistance:1/0}}),[t,l,o,i,r]),h=R.useCallback(()=>{a?.(n,!!s,"mousedown")},[n,s,a]),d=R.useCallback(()=>{a?.(n,!!s,"click")},[n,s,a]);return ce.jsx(uc,{...u,onMouseDown:h,onClick:d})};function gPe(){if(Jl!=null)return Jl;Jl=document.createElement("canvas"),Jl.width=16,Jl.height=16;const e=Jl.getContext("2d");return Vn(e!=null),e.fillStyle="white",e.fillRect(3,3,10,10),e.strokeStyle="black",e.lineWidth=2,e.strokeRect(3,3,10,10),Jl}function yPe(){return EN(pPe,{size:32,color:"white",strokeColor:h0})}function bPe(){return EN(mPe,{size:32,color:"white",strokeColor:dPe})}function _Pe(){if(Ql!=null)return Ql;Ql=document.createElement("canvas"),Ql.width=32,Ql.height=32;const e=Ql.getContext("2d");return Vn(e!=null),e.beginPath(),e.arc(16,16,12,0,2*Math.PI),e.fillStyle="white",e.fill(),e.strokeStyle=fPe,e.lineWidth=4,e.stroke(),e.beginPath(),e.moveTo(16,8),e.lineTo(16,24),e.stroke(),e.moveTo(8,16),e.lineTo(24,16),e.stroke(),Ql}function EN(e,t){if(e!=null)return e;e=document.createElement("canvas"),e.width=t.size,e.height=t.size;const n=e.getContext("2d");return Vn(n!=null),n.beginPath(),n.arc(t.size/2,t.size/2,t.size/2-4,0,2*Math.PI),n.fillStyle=t.color,n.fill(),n.strokeStyle=t.strokeColor,n.lineWidth=4,n.stroke(),e}function vPe(e,t){if(typeof e=="function")return e(t),()=>{e(null)};if(e!=null)return e.current=t,()=>{e.current=null}}const f0=R.memo(R.forwardRef(({entities:e,...t},n)=>{const{viewer:i}=$n(),r=i?.scene,o=i?.entities,s=e??o,[a,c]=R.useState(()=>new qr(t));return R.useEffect(()=>{c(new qr(t))},[t.id]),R.useEffect(()=>(s?.add(a),()=>{s?.remove(a),r?.requestRender()}),[r,s,a]),R.useEffect(()=>vPe(n,a),[n,a]),Object.assign(a,Ka(t,"id")),r?.requestRender(),null})),wPe={padding:"5px",color:"#fff",backgroundColor:"#000",borderRadius:"5px",lineHeight:1},TN=({children:e})=>ce.jsx("div",{style:wPe,children:e}),CN=R.createContext({});function RN(e){const t=R.useRef(null);return t.current===null&&(t.current=e()),t.current}const xPe=typeof window<"u"?R.useLayoutEffect:R.useEffect,pE=R.createContext(null);function mE(e,t){e.indexOf(t)===-1&&e.push(t)}function Nb(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}const ta=(e,t,n)=>n>t?t:n<e?e:n;function gE(e,t){return t?`${e}. For more information and steps for solving, visit https://motion.dev/troubleshooting/${t}`:e}let Jh=()=>{},Da=()=>{};typeof process<"u"&&process.env?.NODE_ENV!=="production"&&(Jh=(e,t,n)=>{!e&&typeof console<"u"&&console.warn(gE(t,n))},Da=(e,t,n)=>{if(!e)throw new Error(gE(t,n))});const Ua={},IN=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e);function MN(e){return typeof e=="object"&&e!==null}const LN=e=>/^0[^.\s]+$/u.test(e);function PN(e){let t;return()=>(t===void 0&&(t=e()),t)}const Vo=e=>e,SPe=(e,t)=>n=>t(e(n)),p0=(...e)=>e.reduce(SPe),m0=(e,t,n)=>{const i=t-e;return i===0?1:(n-e)/i};class yE{constructor(){this.subscriptions=[]}add(t){return mE(this.subscriptions,t),()=>Nb(this.subscriptions,t)}notify(t,n,i){const r=this.subscriptions.length;if(r)if(r===1)this.subscriptions[0](t,n,i);else for(let o=0;o<r;o++){const s=this.subscriptions[o];s&&s(t,n,i)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const Fo=e=>e*1e3,Ao=e=>e/1e3;function ON(e,t){return t?e*(1e3/t):0}const GN=new Set;function bE(e,t,n){e||GN.has(t)||(console.warn(gE(t,n)),GN.add(t))}const VN=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,EPe=1e-7,TPe=12;function CPe(e,t,n,i,r){let o,s,a=0;do s=t+(n-t)/2,o=VN(s,i,r)-e,o>0?n=s:t=s;while(Math.abs(o)>EPe&&++a<TPe);return s}function g0(e,t,n,i){if(e===t&&n===i)return Vo;const r=o=>CPe(o,0,1,e,n);return o=>o===0||o===1?o:VN(r(o),t,i)}const FN=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,AN=e=>t=>1-e(1-t),zN=g0(.33,1.53,.69,.99),_E=AN(zN),NN=FN(_E),kN=e=>(e*=2)<1?.5*_E(e):.5*(2-Math.pow(2,-10*(e-1))),vE=e=>1-Math.sin(Math.acos(e)),XN=AN(vE),ZN=FN(vE),RPe=g0(.42,0,1,1),IPe=g0(0,0,.58,1),DN=g0(.42,0,.58,1),MPe=e=>Array.isArray(e)&&typeof e[0]!="number",UN=e=>Array.isArray(e)&&typeof e[0]=="number",WN={linear:Vo,easeIn:RPe,easeInOut:DN,easeOut:IPe,circIn:vE,circInOut:ZN,circOut:XN,backIn:_E,backInOut:NN,backOut:zN,anticipate:kN},LPe=e=>typeof e=="string",BN=e=>{if(UN(e)){Da(e.length===4,"Cubic bezier arrays must contain four numerical values.","cubic-bezier-length");const[t,n,i,r]=e;return g0(t,n,i,r)}else if(LPe(e))return Da(WN[e]!==void 0,`Invalid easing type '${e}'`,"invalid-easing-type"),WN[e];return e},kb=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function PPe(e,t){let n=new Set,i=new Set,r=!1,o=!1;const s=new WeakSet;let a={delta:0,timestamp:0,isProcessing:!1};function c(u){s.has(u)&&(l.schedule(u),e()),u(a)}const l={schedule:(u,h=!1,d=!1)=>{const p=d&&r?n:i;return h&&s.add(u),p.has(u)||p.add(u),u},cancel:u=>{i.delete(u),s.delete(u)},process:u=>{if(a=u,r){o=!0;return}r=!0,[n,i]=[i,n],n.forEach(c),n.clear(),r=!1,o&&(o=!1,l.process(u))}};return l}const OPe=40;function YN(e,t){let n=!1,i=!0;const r={delta:0,timestamp:0,isProcessing:!1},o=()=>n=!0,s=kb.reduce((S,T)=>(S[T]=PPe(o),S),{}),{setup:a,read:c,resolveKeyframes:l,preUpdate:u,update:h,preRender:d,render:f,postRender:p}=s,m=()=>{const S=Ua.useManualTiming?r.timestamp:performance.now();n=!1,Ua.useManualTiming||(r.delta=i?1e3/60:Math.max(Math.min(S-r.timestamp,OPe),1)),r.timestamp=S,r.isProcessing=!0,a.process(r),c.process(r),l.process(r),u.process(r),h.process(r),d.process(r),f.process(r),p.process(r),r.isProcessing=!1,n&&t&&(i=!1,e(m))},y=()=>{n=!0,i=!0,r.isProcessing||e(m)};return{schedule:kb.reduce((S,T)=>{const C=s[T];return S[T]=(O,V=!1,A=!1)=>(n||y(),C.schedule(O,V,A)),S},{}),cancel:S=>{for(let T=0;T<kb.length;T++)s[kb[T]].cancel(S)},state:r,steps:s}}const{schedule:Tn,cancel:Bc,state:zi,steps:wE}=YN(typeof requestAnimationFrame<"u"?requestAnimationFrame:Vo,!0);let Xb;function GPe(){Xb=void 0}const yr={now:()=>(Xb===void 0&&yr.set(zi.isProcessing||Ua.useManualTiming?zi.timestamp:performance.now()),Xb),set:e=>{Xb=e,queueMicrotask(GPe)}},HN=e=>t=>typeof t=="string"&&t.startsWith(e),jN=HN("--"),VPe=HN("var(--"),xE=e=>VPe(e)?FPe.test(e.split("/*")[0].trim()):!1,FPe=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function KN(e){return typeof e!="string"?!1:e.split("/*")[0].includes("var(--")}const Qh={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},y0={...Qh,transform:e=>ta(0,1,e)},Zb={...Qh,default:1},b0=e=>Math.round(e*1e5)/1e5,SE=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function APe(e){return e==null}const zPe=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,EE=(e,t)=>n=>!!(typeof n=="string"&&zPe.test(n)&&n.startsWith(e)||t&&!APe(n)&&Object.prototype.hasOwnProperty.call(n,t)),JN=(e,t,n)=>i=>{if(typeof i!="string")return i;const[r,o,s,a]=i.match(SE);return{[e]:parseFloat(r),[t]:parseFloat(o),[n]:parseFloat(s),alpha:a!==void 0?parseFloat(a):1}},NPe=e=>ta(0,255,e),TE={...Qh,transform:e=>Math.round(NPe(e))},ql={test:EE("rgb","red"),parse:JN("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:i=1})=>"rgba("+TE.transform(e)+", "+TE.transform(t)+", "+TE.transform(n)+", "+b0(y0.transform(i))+")"};function kPe(e){let t="",n="",i="",r="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),i=e.substring(5,7),r=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),i=e.substring(3,4),r=e.substring(4,5),t+=t,n+=n,i+=i,r+=r),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(i,16),alpha:r?parseInt(r,16)/255:1}}const CE={test:EE("#"),parse:kPe,transform:ql.transform},_0=e=>({test:t=>typeof t=="string"&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Yc=_0("deg"),na=_0("%"),ct=_0("px"),XPe=_0("vh"),ZPe=_0("vw"),QN={...na,parse:e=>na.parse(e)/100,transform:e=>na.transform(e*100)},qh={test:EE("hsl","hue"),parse:JN("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:i=1})=>"hsla("+Math.round(e)+", "+na.transform(b0(t))+", "+na.transform(b0(n))+", "+b0(y0.transform(i))+")"},li={test:e=>ql.test(e)||CE.test(e)||qh.test(e),parse:e=>ql.test(e)?ql.parse(e):qh.test(e)?qh.parse(e):CE.parse(e),transform:e=>typeof e=="string"?e:e.hasOwnProperty("red")?ql.transform(e):qh.transform(e),getAnimatableNone:e=>{const t=li.parse(e);return t.alpha=0,li.transform(t)}},DPe=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function UPe(e){return isNaN(e)&&typeof e=="string"&&(e.match(SE)?.length||0)+(e.match(DPe)?.length||0)>0}const qN="number",$N="color",WPe="var",BPe="var(",ek="${}",YPe=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function v0(e){const t=e.toString(),n=[],i={color:[],number:[],var:[]},r=[];let o=0;const a=t.replace(YPe,c=>(li.test(c)?(i.color.push(o),r.push($N),n.push(li.parse(c))):c.startsWith(BPe)?(i.var.push(o),r.push(WPe),n.push(c)):(i.number.push(o),r.push(qN),n.push(parseFloat(c))),++o,ek)).split(ek);return{values:n,split:a,indexes:i,types:r}}function tk(e){return v0(e).values}function nk(e){const{split:t,types:n}=v0(e),i=t.length;return r=>{let o="";for(let s=0;s<i;s++)if(o+=t[s],r[s]!==void 0){const a=n[s];a===qN?o+=b0(r[s]):a===$N?o+=li.transform(r[s]):o+=r[s]}return o}}const HPe=e=>typeof e=="number"?0:li.test(e)?li.getAnimatableNone(e):e;function jPe(e){const t=tk(e);return nk(e)(t.map(HPe))}const fs={test:UPe,parse:tk,createTransformer:nk,getAnimatableNone:jPe};function RE(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function KPe({hue:e,saturation:t,lightness:n,alpha:i}){e/=360,t/=100,n/=100;let r=0,o=0,s=0;if(!t)r=o=s=n;else{const a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;r=RE(c,a,e+1/3),o=RE(c,a,e),s=RE(c,a,e-1/3)}return{red:Math.round(r*255),green:Math.round(o*255),blue:Math.round(s*255),alpha:i}}function Db(e,t){return n=>n>0?t:e}const Dn=(e,t,n)=>e+(t-e)*n,IE=(e,t,n)=>{const i=e*e,r=n*(t*t-i)+i;return r<0?0:Math.sqrt(r)},JPe=[CE,ql,qh],QPe=e=>JPe.find(t=>t.test(e));function ik(e){const t=QPe(e);if(Jh(!!t,`'${e}' is not an animatable color. Use the equivalent color code instead.`,"color-not-animatable"),!t)return!1;let n=t.parse(e);return t===qh&&(n=KPe(n)),n}const rk=(e,t)=>{const n=ik(e),i=ik(t);if(!n||!i)return Db(e,t);const r={...n};return o=>(r.red=IE(n.red,i.red,o),r.green=IE(n.green,i.green,o),r.blue=IE(n.blue,i.blue,o),r.alpha=Dn(n.alpha,i.alpha,o),ql.transform(r))},ME=new Set(["none","hidden"]);function qPe(e,t){return ME.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function $Pe(e,t){return n=>Dn(e,t,n)}function LE(e){return typeof e=="number"?$Pe:typeof e=="string"?xE(e)?Db:li.test(e)?rk:nOe:Array.isArray(e)?ok:typeof e=="object"?li.test(e)?rk:eOe:Db}function ok(e,t){const n=[...e],i=n.length,r=e.map((o,s)=>LE(o)(o,t[s]));return o=>{for(let s=0;s<i;s++)n[s]=r[s](o);return n}}function eOe(e,t){const n={...e,...t},i={};for(const r in n)e[r]!==void 0&&t[r]!==void 0&&(i[r]=LE(e[r])(e[r],t[r]));return r=>{for(const o in i)n[o]=i[o](r);return n}}function tOe(e,t){const n=[],i={color:0,var:0,number:0};for(let r=0;r<t.values.length;r++){const o=t.types[r],s=e.indexes[o][i[o]],a=e.values[s]??0;n[r]=a,i[o]++}return n}const nOe=(e,t)=>{const n=fs.createTransformer(t),i=v0(e),r=v0(t);return i.indexes.var.length===r.indexes.var.length&&i.indexes.color.length===r.indexes.color.length&&i.indexes.number.length>=r.indexes.number.length?ME.has(e)&&!r.values.length||ME.has(t)&&!i.values.length?qPe(e,t):p0(ok(tOe(i,r),r.values),n):(Jh(!0,`Complex values '${e}' and '${t}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`,"complex-values-different"),Db(e,t))};function sk(e,t,n){return typeof e=="number"&&typeof t=="number"&&typeof n=="number"?Dn(e,t,n):LE(e)(e,t)}const iOe=e=>{const t=({timestamp:n})=>e(n);return{start:(n=!0)=>Tn.update(t,n),stop:()=>Bc(t),now:()=>zi.isProcessing?zi.timestamp:yr.now()}},ak=(e,t,n=10)=>{let i="";const r=Math.max(Math.round(t/n),2);for(let o=0;o<r;o++)i+=Math.round(e(o/(r-1))*1e4)/1e4+", ";return`linear(${i.substring(0,i.length-2)})`},Ub=2e4;function PE(e){let t=0;const n=50;let i=e.next(t);for(;!i.done&&t<Ub;)t+=n,i=e.next(t);return t>=Ub?1/0:t}function rOe(e,t=100,n){const i=n({...e,keyframes:[0,t]}),r=Math.min(PE(i),Ub);return{type:"keyframes",ease:o=>i.next(r*o).value/t,duration:Ao(r)}}const oOe=5;function ck(e,t,n){const i=Math.max(t-oOe,0);return ON(n-e(i),t-i)}const Un={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},OE=.001;function sOe({duration:e=Un.duration,bounce:t=Un.bounce,velocity:n=Un.velocity,mass:i=Un.mass}){let r,o;Jh(e<=Fo(Un.maxDuration),"Spring duration must be 10 seconds or less","spring-duration-limit");let s=1-t;s=ta(Un.minDamping,Un.maxDamping,s),e=ta(Un.minDuration,Un.maxDuration,Ao(e)),s<1?(r=l=>{const u=l*s,h=u*e,d=u-n,f=GE(l,s),p=Math.exp(-h);return OE-d/f*p},o=l=>{const h=l*s*e,d=h*n+n,f=Math.pow(s,2)*Math.pow(l,2)*e,p=Math.exp(-h),m=GE(Math.pow(l,2),s);return(-r(l)+OE>0?-1:1)*((d-f)*p)/m}):(r=l=>{const u=Math.exp(-l*e),h=(l-n)*e+1;return-OE+u*h},o=l=>{const u=Math.exp(-l*e),h=(n-l)*(e*e);return u*h});const a=5/e,c=cOe(r,o,a);if(e=Fo(e),isNaN(c))return{stiffness:Un.stiffness,damping:Un.damping,duration:e};{const l=Math.pow(c,2)*i;return{stiffness:l,damping:s*2*Math.sqrt(i*l),duration:e}}}const aOe=12;function cOe(e,t,n){let i=n;for(let r=1;r<aOe;r++)i=i-e(i)/t(i);return i}function GE(e,t){return e*Math.sqrt(1-t*t)}const lOe=["duration","bounce"],uOe=["stiffness","damping","mass"];function lk(e,t){return t.some(n=>e[n]!==void 0)}function hOe(e){let t={velocity:Un.velocity,stiffness:Un.stiffness,damping:Un.damping,mass:Un.mass,isResolvedFromDuration:!1,...e};if(!lk(e,uOe)&&lk(e,lOe))if(t.velocity=0,e.visualDuration){const n=e.visualDuration,i=2*Math.PI/(n*1.2),r=i*i,o=2*ta(.05,1,1-(e.bounce||0))*Math.sqrt(r);t={...t,mass:Un.mass,stiffness:r,damping:o}}else{const n=sOe({...e,velocity:0});t={...t,...n,mass:Un.mass},t.isResolvedFromDuration=!0}return t}function Wb(e=Un.visualDuration,t=Un.bounce){const n=typeof e!="object"?{visualDuration:e,keyframes:[0,1],bounce:t}:e;let{restSpeed:i,restDelta:r}=n;const o=n.keyframes[0],s=n.keyframes[n.keyframes.length-1],a={done:!1,value:o},{stiffness:c,damping:l,mass:u,duration:h,velocity:d,isResolvedFromDuration:f}=hOe({...n,velocity:-Ao(n.velocity||0)}),p=d||0,m=l/(2*Math.sqrt(c*u)),y=s-o,g=Ao(Math.sqrt(c/u)),v=Math.abs(y)<5;i||(i=v?Un.restSpeed.granular:Un.restSpeed.default),r||(r=v?Un.restDelta.granular:Un.restDelta.default);let S;if(m<1){const C=GE(g,m);S=O=>{const V=Math.exp(-m*g*O);return s-V*((p+m*g*y)/C*Math.sin(C*O)+y*Math.cos(C*O))}}else if(m===1)S=C=>s-Math.exp(-g*C)*(y+(p+g*y)*C);else{const C=g*Math.sqrt(m*m-1);S=O=>{const V=Math.exp(-m*g*O),A=Math.min(C*O,300);return s-V*((p+m*g*y)*Math.sinh(A)+C*y*Math.cosh(A))/C}}const T={calculatedDuration:f&&h||null,next:C=>{const O=S(C);if(f)a.done=C>=h;else{let V=C===0?p:0;m<1&&(V=C===0?Fo(p):ck(S,C,O));const A=Math.abs(V)<=i,G=Math.abs(s-O)<=r;a.done=A&&G}return a.value=a.done?s:O,a},toString:()=>{const C=Math.min(PE(T),Ub),O=ak(V=>T.next(C*V).value,C,30);return C+"ms "+O},toTransition:()=>{}};return T}Wb.applyToOptions=e=>{const t=rOe(e,100,Wb);return e.ease=t.ease,e.duration=Fo(t.duration),e.type="keyframes",e};function VE({keyframes:e,velocity:t=0,power:n=.8,timeConstant:i=325,bounceDamping:r=10,bounceStiffness:o=500,modifyTarget:s,min:a,max:c,restDelta:l=.5,restSpeed:u}){const h=e[0],d={done:!1,value:h},f=A=>a!==void 0&&A<a||c!==void 0&&A>c,p=A=>a===void 0?c:c===void 0||Math.abs(a-A)<Math.abs(c-A)?a:c;let m=n*t;const y=h+m,g=s===void 0?y:s(y);g!==y&&(m=g-h);const v=A=>-m*Math.exp(-A/i),S=A=>g+v(A),T=A=>{const G=v(A),k=S(A);d.done=Math.abs(G)<=l,d.value=d.done?g:k};let C,O;const V=A=>{f(d.value)&&(C=A,O=Wb({keyframes:[d.value,p(d.value)],velocity:ck(S,A,d.value),damping:r,stiffness:o,restDelta:l,restSpeed:u}))};return V(0),{calculatedDuration:null,next:A=>{let G=!1;return!O&&C===void 0&&(G=!0,T(A),V(A)),C!==void 0&&A>=C?O.next(A-C):(!G&&T(A),d)}}}function dOe(e,t,n){const i=[],r=n||Ua.mix||sk,o=e.length-1;for(let s=0;s<o;s++){let a=r(e[s],e[s+1]);if(t){const c=Array.isArray(t)?t[s]||Vo:t;a=p0(c,a)}i.push(a)}return i}function fOe(e,t,{clamp:n=!0,ease:i,mixer:r}={}){const o=e.length;if(Da(o===t.length,"Both input and output ranges must be the same length","range-length"),o===1)return()=>t[0];if(o===2&&t[0]===t[1])return()=>t[1];const s=e[0]===e[1];e[0]>e[o-1]&&(e=[...e].reverse(),t=[...t].reverse());const a=dOe(t,i,r),c=a.length,l=u=>{if(s&&u<e[0])return t[0];let h=0;if(c>1)for(;h<e.length-2&&!(u<e[h+1]);h++);const d=m0(e[h],e[h+1],u);return a[h](d)};return n?u=>l(ta(e[0],e[o-1],u)):l}function pOe(e,t){const n=e[e.length-1];for(let i=1;i<=t;i++){const r=m0(0,t,i);e.push(Dn(n,1,r))}}function mOe(e){const t=[0];return pOe(t,e.length-1),t}function gOe(e,t){return e.map(n=>n*t)}function yOe(e,t){return e.map(()=>t||DN).splice(0,e.length-1)}function $h({duration:e=300,keyframes:t,times:n,ease:i="easeInOut"}){const r=MPe(i)?i.map(BN):BN(i),o={done:!1,value:t[0]},s=gOe(n&&n.length===t.length?n:mOe(t),e),a=fOe(s,t,{ease:Array.isArray(r)?r:yOe(t,r)});return{calculatedDuration:e,next:c=>(o.value=a(c),o.done=c>=e,o)}}const bOe=e=>e!==null;function FE(e,{repeat:t,repeatType:n="loop"},i,r=1){const o=e.filter(bOe),a=r<0||t&&n!=="loop"&&t%2===1?0:o.length-1;return!a||i===void 0?o[a]:i}const _Oe={decay:VE,inertia:VE,tween:$h,keyframes:$h,spring:Wb};function uk(e){typeof e.type=="string"&&(e.type=_Oe[e.type])}class AE{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(t=>{this.resolve=t})}notifyFinished(){this.resolve()}then(t,n){return this.finished.then(t,n)}}const vOe=e=>e/100;class zE extends AE{constructor(t){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:n}=this.options;n&&n.updatedAt!==yr.now()&&this.tick(yr.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=t,this.initAnimation(),this.play(),t.autoplay===!1&&this.pause()}initAnimation(){const{options:t}=this;uk(t);const{type:n=$h,repeat:i=0,repeatDelay:r=0,repeatType:o,velocity:s=0}=t;let{keyframes:a}=t;const c=n||$h;process.env.NODE_ENV!=="production"&&c!==$h&&Da(a.length<=2,`Only two keyframes currently supported with spring and inertia animations. Trying to animate ${a}`,"spring-two-frames"),c!==$h&&typeof a[0]!="number"&&(this.mixKeyframes=p0(vOe,sk(a[0],a[1])),a=[0,100]);const l=c({...t,keyframes:a});o==="mirror"&&(this.mirroredGenerator=c({...t,keyframes:[...a].reverse(),velocity:-s})),l.calculatedDuration===null&&(l.calculatedDuration=PE(l));const{calculatedDuration:u}=l;this.calculatedDuration=u,this.resolvedDuration=u+r,this.totalDuration=this.resolvedDuration*(i+1)-r,this.generator=l}updateTime(t){const n=Math.round(t-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=n}tick(t,n=!1){const{generator:i,totalDuration:r,mixKeyframes:o,mirroredGenerator:s,resolvedDuration:a,calculatedDuration:c}=this;if(this.startTime===null)return i.next(0);const{delay:l=0,keyframes:u,repeat:h,repeatType:d,repeatDelay:f,type:p,onUpdate:m,finalKeyframe:y}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,t):this.speed<0&&(this.startTime=Math.min(t-r/this.speed,this.startTime)),n?this.currentTime=t:this.updateTime(t);const g=this.currentTime-l*(this.playbackSpeed>=0?1:-1),v=this.playbackSpeed>=0?g<0:g>r;this.currentTime=Math.max(g,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=r);let S=this.currentTime,T=i;if(h){const A=Math.min(this.currentTime,r)/a;let G=Math.floor(A),k=A%1;!k&&A>=1&&(k=1),k===1&&G--,G=Math.min(G,h+1),G%2&&(d==="reverse"?(k=1-k,f&&(k-=f/a)):d==="mirror"&&(T=s)),S=ta(0,1,k)*a}const C=v?{done:!1,value:u[0]}:T.next(S);o&&!v&&(C.value=o(C.value));let{done:O}=C;!v&&c!==null&&(O=this.playbackSpeed>=0?this.currentTime>=r:this.currentTime<=0);const V=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&O);return V&&p!==VE&&(C.value=FE(u,this.options,y,this.speed)),m&&m(C.value),V&&this.finish(),C}then(t,n){return this.finished.then(t,n)}get duration(){return Ao(this.calculatedDuration)}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ao(t)}get time(){return Ao(this.currentTime)}set time(t){t=Fo(t),this.currentTime=t,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=t:this.driver&&(this.startTime=this.driver.now()-t/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state="paused",this.holdTime=t,this.tick(t))}get speed(){return this.playbackSpeed}set speed(t){const n=this.playbackSpeed!==t;n&&this.driver&&this.updateTime(yr.now()),this.playbackSpeed=t,n&&this.driver&&(this.time=Ao(this.currentTime))}play(){if(this.isStopped)return;const{driver:t=iOe,startTime:n}=this.options;this.driver||(this.driver=t(r=>this.tick(r))),this.options.onPlay?.();const i=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=i):this.holdTime!==null?this.startTime=i-this.holdTime:this.startTime||(this.startTime=n??i),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(yr.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(t){return this.startTime=0,this.tick(t,!0)}attachTimeline(t){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),t.observe(this)}}function wOe(e){for(let t=1;t<e.length;t++)e[t]??(e[t]=e[t-1])}const $l=e=>e*180/Math.PI,NE=e=>{const t=$l(Math.atan2(e[1],e[0]));return kE(t)},xOe={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:NE,rotateZ:NE,skewX:e=>$l(Math.atan(e[1])),skewY:e=>$l(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},kE=e=>(e=e%360,e<0&&(e+=360),e),hk=NE,dk=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),fk=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),SOe={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:dk,scaleY:fk,scale:e=>(dk(e)+fk(e))/2,rotateX:e=>kE($l(Math.atan2(e[6],e[5]))),rotateY:e=>kE($l(Math.atan2(-e[2],e[0]))),rotateZ:hk,rotate:hk,skewX:e=>$l(Math.atan(e[4])),skewY:e=>$l(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function XE(e){return e.includes("scale")?1:0}function ZE(e,t){if(!e||e==="none")return XE(t);const n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let i,r;if(n)i=SOe,r=n;else{const a=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);i=xOe,r=a}if(!r)return XE(t);const o=i[t],s=r[1].split(",").map(TOe);return typeof o=="function"?o(s):s[o]}const EOe=(e,t)=>{const{transform:n="none"}=getComputedStyle(e);return ZE(n,t)};function TOe(e){return parseFloat(e.trim())}const ed=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],td=new Set(ed),pk=e=>e===Qh||e===ct,COe=new Set(["x","y","z"]),ROe=ed.filter(e=>!COe.has(e));function IOe(e){const t=[];return ROe.forEach(n=>{const i=e.getValue(n);i!==void 0&&(t.push([n,i.get()]),i.set(n.startsWith("scale")?1:0))}),t}const Hc={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:(e,{transform:t})=>ZE(t,"x"),y:(e,{transform:t})=>ZE(t,"y")};Hc.translateX=Hc.x,Hc.translateY=Hc.y;const eu=new Set;let DE=!1,UE=!1,WE=!1;function mk(){if(UE){const e=Array.from(eu).filter(i=>i.needsMeasurement),t=new Set(e.map(i=>i.element)),n=new Map;t.forEach(i=>{const r=IOe(i);r.length&&(n.set(i,r),i.render())}),e.forEach(i=>i.measureInitialState()),t.forEach(i=>{i.render();const r=n.get(i);r&&r.forEach(([o,s])=>{i.getValue(o)?.set(s)})}),e.forEach(i=>i.measureEndState()),e.forEach(i=>{i.suspendedScrollY!==void 0&&window.scrollTo(0,i.suspendedScrollY)})}UE=!1,DE=!1,eu.forEach(e=>e.complete(WE)),eu.clear()}function gk(){eu.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(UE=!0)})}function MOe(){WE=!0,gk(),mk(),WE=!1}class BE{constructor(t,n,i,r,o,s=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...t],this.onComplete=n,this.name=i,this.motionValue=r,this.element=o,this.isAsync=s}scheduleResolve(){this.state="scheduled",this.isAsync?(eu.add(this),DE||(DE=!0,Tn.read(gk),Tn.resolveKeyframes(mk))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:t,name:n,element:i,motionValue:r}=this;if(t[0]===null){const o=r?.get(),s=t[t.length-1];if(o!==void 0)t[0]=o;else if(i&&n){const a=i.readValue(n,s);a!=null&&(t[0]=a)}t[0]===void 0&&(t[0]=s),r&&o===void 0&&r.set(t[0])}wOe(t)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(t=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,t),eu.delete(this)}cancel(){this.state==="scheduled"&&(eu.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const LOe=e=>e.startsWith("--");function yk(e,t,n){LOe(t)?e.style.setProperty(t,n):e.style[t]=n}const POe={};function bk(e,t){const n=PN(e);return()=>POe[t]??n()}const OOe=bk(()=>window.ScrollTimeline!==void 0,"scrollTimeline"),_k=bk(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),w0=([e,t,n,i])=>`cubic-bezier(${e}, ${t}, ${n}, ${i})`,vk={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:w0([0,.65,.55,1]),circOut:w0([.55,0,1,.45]),backIn:w0([.31,.01,.66,-.59]),backOut:w0([.33,1.53,.69,.99])};function wk(e,t){if(e)return typeof e=="function"?_k()?ak(e,t):"ease-out":UN(e)?w0(e):Array.isArray(e)?e.map(n=>wk(n,t)||vk.easeOut):vk[e]}function GOe(e,t,n,{delay:i=0,duration:r=300,repeat:o=0,repeatType:s="loop",ease:a="easeOut",times:c}={},l=void 0){const u={[t]:n};c&&(u.offset=c);const h=wk(a,r);Array.isArray(h)&&(u.easing=h);const d={delay:i,duration:r,easing:Array.isArray(h)?"linear":h,fill:"both",iterations:o+1,direction:s==="reverse"?"alternate":"normal"};return l&&(d.pseudoElement=l),e.animate(u,d)}function xk(e){return typeof e=="function"&&"applyToOptions"in e}function VOe({type:e,...t}){return xk(e)&&_k()?e.applyToOptions(t):(t.duration??(t.duration=300),t.ease??(t.ease="easeOut"),t)}class Sk extends AE{constructor(t){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!t)return;const{element:n,name:i,keyframes:r,pseudoElement:o,allowFlatten:s=!1,finalKeyframe:a,onComplete:c}=t;this.isPseudoElement=!!o,this.allowFlatten=s,this.options=t,Da(typeof t.type!="string",`Mini animate() doesn't support "type" as a string.`,"mini-spring");const l=VOe(t);this.animation=GOe(n,i,r,l,o),l.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!o){const u=FE(r,this.options,a,this.speed);this.updateMotionValue&&this.updateMotionValue(u),yk(n,i,u),this.animation.cancel()}c?.(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:t}=this;t==="idle"||t==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){const t=this.options?.element;!this.isPseudoElement&&t?.isConnected&&this.animation.commitStyles?.()}get duration(){const t=this.animation.effect?.getComputedTiming?.().duration||0;return Ao(Number(t))}get iterationDuration(){const{delay:t=0}=this.options||{};return this.duration+Ao(t)}get time(){return Ao(Number(this.animation.currentTime)||0)}set time(t){const n=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=Fo(t),n&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(t){t<0&&(this.finishedTime=null),this.animation.playbackRate=t}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(t){this.manualStartTime=this.animation.startTime=t}attachTimeline({timeline:t,rangeStart:n,rangeEnd:i,observe:r}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,t&&OOe()?(this.animation.timeline=t,n&&(this.animation.rangeStart=n),i&&(this.animation.rangeEnd=i),Vo):r(this)}}const Ek={anticipate:kN,backInOut:NN,circInOut:ZN};function FOe(e){return e in Ek}function AOe(e){typeof e.ease=="string"&&FOe(e.ease)&&(e.ease=Ek[e.ease])}const YE=10;class zOe extends Sk{constructor(t){AOe(t),uk(t),super(t),t.startTime!==void 0&&(this.startTime=t.startTime),this.options=t}updateMotionValue(t){const{motionValue:n,onUpdate:i,onComplete:r,element:o,...s}=this.options;if(!n)return;if(t!==void 0){n.set(t);return}const a=new zE({...s,autoplay:!1}),c=Math.max(YE,yr.now()-this.startTime),l=ta(0,YE,c-YE),u=a.sample(c).value,{name:h}=this.options;o&&h&&yk(o,h,u),n.setWithVelocity(a.sample(Math.max(0,c-l)).value,u,l),a.stop()}}const Tk=(e,t)=>t==="zIndex"?!1:!!(typeof e=="number"||Array.isArray(e)||typeof e=="string"&&(fs.test(e)||e==="0")&&!e.startsWith("url("));function NOe(e){const t=e[0];if(e.length===1)return!0;for(let n=0;n<e.length;n++)if(e[n]!==t)return!0}function kOe(e,t,n,i){const r=e[0];if(r===null)return!1;if(t==="display"||t==="visibility")return!0;const o=e[e.length-1],s=Tk(r,t),a=Tk(o,t);return Jh(s===a,`You are trying to animate ${t} from "${r}" to "${o}". "${s?o:r}" is not an animatable value.`,"value-not-animatable"),!s||!a?!1:NOe(e)||(n==="spring"||xk(n))&&i}function HE(e){e.duration=0,e.type="keyframes"}const XOe=new Set(["opacity","clipPath","filter","transform"]),ZOe=PN(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));function DOe(e){const{motionValue:t,name:n,repeatDelay:i,repeatType:r,damping:o,type:s}=e;if(!(t?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:c,transformTemplate:l}=t.owner.getProps();return ZOe()&&n&&XOe.has(n)&&(n!=="transform"||!l)&&!c&&!i&&r!=="mirror"&&o!==0&&s!=="inertia"}const UOe=40;class WOe extends AE{constructor({autoplay:t=!0,delay:n=0,type:i="keyframes",repeat:r=0,repeatDelay:o=0,repeatType:s="loop",keyframes:a,name:c,motionValue:l,element:u,...h}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=yr.now();const d={autoplay:t,delay:n,type:i,repeat:r,repeatDelay:o,repeatType:s,name:c,motionValue:l,element:u,...h},f=u?.KeyframeResolver||BE;this.keyframeResolver=new f(a,(p,m,y)=>this.onKeyframesResolved(p,m,d,!y),c,l,u),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(t,n,i,r){this.keyframeResolver=void 0;const{name:o,type:s,velocity:a,delay:c,isHandoff:l,onUpdate:u}=i;this.resolvedAt=yr.now(),kOe(t,o,s,a)||((Ua.instantAnimations||!c)&&u?.(FE(t,i,n)),t[0]=t[t.length-1],HE(i),i.repeat=0);const d={startTime:r?this.resolvedAt?this.resolvedAt-this.createdAt>UOe?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:n,...i,keyframes:t},f=!l&&DOe(d),p=d.motionValue?.owner?.current,m=f?new zOe({...d,element:p}):new zE(d);m.finished.then(()=>{this.notifyFinished()}).catch(Vo),this.pendingTimeline&&(this.stopTimeline=m.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=m}get finished(){return this._animation?this.animation.finished:this._finished}then(t,n){return this.finished.finally(t).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),MOe()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(t){this.animation.time=t}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(t){this.animation.speed=t}get startTime(){return this.animation.startTime}attachTimeline(t){return this._animation?this.stopTimeline=this.animation.attachTimeline(t):this.pendingTimeline=t,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}function Ck(e,t,n,i=0,r=1){const o=Array.from(e).sort((l,u)=>l.sortNodePosition(u)).indexOf(t),s=e.size,a=(s-1)*i;return typeof n=="function"?n(o,s):r===1?o*i:a-o*i}const BOe=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function YOe(e){const t=BOe.exec(e);if(!t)return[,];const[,n,i,r]=t;return[`--${n??i}`,r]}const HOe=4;function Rk(e,t,n=1){Da(n<=HOe,`Max CSS variable fallback depth detected in property "${e}". This may indicate a circular fallback dependency.`,"max-css-var-depth");const[i,r]=YOe(e);if(!i)return;const o=window.getComputedStyle(t).getPropertyValue(i);if(o){const s=o.trim();return IN(s)?parseFloat(s):s}return xE(r)?Rk(r,t,n+1):r}const jOe={type:"spring",stiffness:500,damping:25,restSpeed:10},KOe=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),JOe={type:"keyframes",duration:.8},QOe={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},qOe=(e,{keyframes:t})=>t.length>2?JOe:td.has(e)?e.startsWith("scale")?KOe(t[1]):jOe:QOe,$Oe=e=>e!==null;function eGe(e,{repeat:t,repeatType:n="loop"},i){const r=e.filter($Oe),o=t&&n!=="loop"&&t%2===1?0:r.length-1;return r[o]}function Ik(e,t){if(e?.inherit&&t){const{inherit:n,...i}=e;return{...t,...i}}return e}function jE(e,t){const n=e?.[t]??e?.default??e;return n!==e?Ik(n,e):n}function tGe({when:e,delay:t,delayChildren:n,staggerChildren:i,staggerDirection:r,repeat:o,repeatType:s,repeatDelay:a,from:c,elapsed:l,...u}){return!!Object.keys(u).length}const KE=(e,t,n,i={},r,o)=>s=>{const a=jE(i,e)||{},c=a.delay||i.delay||0;let{elapsed:l=0}=i;l=l-Fo(c);const u={keyframes:Array.isArray(n)?n:[null,n],ease:"easeOut",velocity:t.getVelocity(),...a,delay:-l,onUpdate:d=>{t.set(d),a.onUpdate&&a.onUpdate(d)},onComplete:()=>{s(),a.onComplete&&a.onComplete()},name:e,motionValue:t,element:o?void 0:r};tGe(a)||Object.assign(u,qOe(e,u)),u.duration&&(u.duration=Fo(u.duration)),u.repeatDelay&&(u.repeatDelay=Fo(u.repeatDelay)),u.from!==void 0&&(u.keyframes[0]=u.from);let h=!1;if((u.type===!1||u.duration===0&&!u.repeatDelay)&&(HE(u),u.delay===0&&(h=!0)),(Ua.instantAnimations||Ua.skipAnimations||r?.shouldSkipAnimations)&&(h=!0,HE(u),u.delay=0),u.allowFlatten=!a.type&&!a.ease,h&&!o&&t.get()!==void 0){const d=eGe(u.keyframes,a);if(d!==void 0){Tn.update(()=>{u.onUpdate(d),u.onComplete()});return}}return a.isSync?new zE(u):new WOe(u)};function Mk(e){const t=[{},{}];return e?.values.forEach((n,i)=>{t[0][i]=n.get(),t[1][i]=n.getVelocity()}),t}function JE(e,t,n,i){if(typeof t=="function"){const[r,o]=Mk(i);t=t(n!==void 0?n:e.custom,r,o)}if(typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"){const[r,o]=Mk(i);t=t(n!==void 0?n:e.custom,r,o)}return t}function nd(e,t,n){const i=e.getProps();return JE(i,t,n!==void 0?n:i.custom,e)}const Lk=new Set(["width","height","top","left","right","bottom",...ed]),Pk=30,nGe=e=>!isNaN(parseFloat(e));class iGe{constructor(t,n={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=i=>{const r=yr.now();if(this.updatedAt!==r&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(i),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const o of this.dependents)o.dirty()},this.hasAnimated=!1,this.setCurrent(t),this.owner=n.owner}setCurrent(t){this.current=t,this.updatedAt=yr.now(),this.canTrackVelocity===null&&t!==void 0&&(this.canTrackVelocity=nGe(this.current))}setPrevFrameValue(t=this.current){this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt}onChange(t){return process.env.NODE_ENV!=="production"&&bE(!1,'value.onChange(callback) is deprecated. Switch to value.on("change", callback).'),this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new yE);const i=this.events[t].add(n);return t==="change"?()=>{i(),Tn.read(()=>{this.events.change.getSize()||this.stop()})}:i}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t){this.passiveEffect?this.passiveEffect(t,this.updateAndNotify):this.updateAndNotify(t)}setWithVelocity(t,n,i){this.set(n),this.prev=void 0,this.prevFrameValue=t,this.prevUpdatedAt=this.updatedAt-i}jump(t,n=!0){this.updateAndNotify(t),this.prev=t,this.prevUpdatedAt=this.prevFrameValue=void 0,n&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(t){this.dependents||(this.dependents=new Set),this.dependents.add(t)}removeDependent(t){this.dependents&&this.dependents.delete(t)}get(){return this.current}getPrevious(){return this.prev}getVelocity(){const t=yr.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||t-this.updatedAt>Pk)return 0;const n=Math.min(this.updatedAt-this.prevUpdatedAt,Pk);return ON(parseFloat(this.current)-parseFloat(this.prevFrameValue),n)}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function tu(e,t){return new iGe(e,t)}const QE=e=>Array.isArray(e);function rGe(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,tu(n))}function oGe(e){return QE(e)?e[e.length-1]||0:e}function sGe(e,t){const n=nd(e,t);let{transitionEnd:i={},transition:r={},...o}=n||{};o={...o,...i};for(const s in o){const a=oGe(o[s]);rGe(e,s,a)}}const tr=e=>!!(e&&e.getVelocity);function aGe(e){return!!(tr(e)&&e.add)}function qE(e,t){const n=e.getValue("willChange");if(aGe(n))return n.add(t);if(!n&&Ua.WillChange){const i=new Ua.WillChange("auto");e.addValue("willChange",i),i.add(t)}}function $E(e){return e.replace(/([A-Z])/g,t=>`-${t.toLowerCase()}`)}const Ok="data-"+$E("framerAppearId");function Gk(e){return e.props[Ok]}function cGe({protectedKeys:e,needsAnimating:t},n){const i=e.hasOwnProperty(n)&&t[n]!==!0;return t[n]=!1,i}function Vk(e,t,{delay:n=0,transitionOverride:i,type:r}={}){let{transition:o,transitionEnd:s,...a}=t;const c=e.getDefaultTransition();o=o?Ik(o,c):c;const l=o?.reduceMotion;i&&(o=i);const u=[],h=r&&e.animationState&&e.animationState.getState()[r];for(const d in a){const f=e.getValue(d,e.latestValues[d]??null),p=a[d];if(p===void 0||h&&cGe(h,d))continue;const m={delay:n,...jE(o||{},d)},y=f.get();if(y!==void 0&&!f.isAnimating&&!Array.isArray(p)&&p===y&&!m.velocity)continue;let g=!1;if(window.MotionHandoffAnimation){const T=Gk(e);if(T){const C=window.MotionHandoffAnimation(T,d,Tn);C!==null&&(m.startTime=C,g=!0)}}qE(e,d);const v=l??e.shouldReduceMotion;f.start(KE(d,f,p,v&&Lk.has(d)?{type:!1}:m,e,g));const S=f.animation;S&&u.push(S)}if(s){const d=()=>Tn.update(()=>{s&&sGe(e,s)});u.length?Promise.all(u).then(d):d()}return u}function eT(e,t,n={}){const i=nd(e,t,n.type==="exit"?e.presenceContext?.custom:void 0);let{transition:r=e.getDefaultTransition()||{}}=i||{};n.transitionOverride&&(r=n.transitionOverride);const o=i?()=>Promise.all(Vk(e,i,n)):()=>Promise.resolve(),s=e.variantChildren&&e.variantChildren.size?(c=0)=>{const{delayChildren:l=0,staggerChildren:u,staggerDirection:h}=r;return lGe(e,t,c,l,u,h,n)}:()=>Promise.resolve(),{when:a}=r;if(a){const[c,l]=a==="beforeChildren"?[o,s]:[s,o];return c().then(()=>l())}else return Promise.all([o(),s(n.delay)])}function lGe(e,t,n=0,i=0,r=0,o=1,s){const a=[];for(const c of e.variantChildren)c.notify("AnimationStart",t),a.push(eT(c,t,{...s,delay:n+(typeof i=="function"?0:i)+Ck(e.variantChildren,c,i,r,o)}).then(()=>c.notify("AnimationComplete",t)));return Promise.all(a)}function uGe(e,t,n={}){e.notify("AnimationStart",t);let i;if(Array.isArray(t)){const r=t.map(o=>eT(e,o,n));i=Promise.all(r)}else if(typeof t=="string")i=eT(e,t,n);else{const r=typeof t=="function"?nd(e,t,n.custom):t;i=Promise.all(Vk(e,r,n))}return i.then(()=>{e.notify("AnimationComplete",t)})}const hGe={test:e=>e==="auto",parse:e=>e},Fk=e=>t=>t.test(e),Ak=[Qh,ct,na,Yc,ZPe,XPe,hGe],zk=e=>Ak.find(Fk(e));function dGe(e){return typeof e=="number"?e===0:e!==null?e==="none"||e==="0"||LN(e):!0}const fGe=new Set(["brightness","contrast","saturate","opacity"]);function pGe(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[i]=n.match(SE)||[];if(!i)return e;const r=n.replace(i,"");let o=fGe.has(t)?1:0;return i!==n&&(o*=100),t+"("+o+r+")"}const mGe=/\b([a-z-]*)\(.*?\)/gu,tT={...fs,getAnimatableNone:e=>{const t=e.match(mGe);return t?t.map(pGe).join(" "):e}},nT={...fs,getAnimatableNone:e=>{const t=fs.parse(e);return fs.createTransformer(e)(t.map(i=>typeof i=="number"?0:typeof i=="object"?{...i,alpha:1}:i))}},Nk={...Qh,transform:Math.round},iT={borderWidth:ct,borderTopWidth:ct,borderRightWidth:ct,borderBottomWidth:ct,borderLeftWidth:ct,borderRadius:ct,borderTopLeftRadius:ct,borderTopRightRadius:ct,borderBottomRightRadius:ct,borderBottomLeftRadius:ct,width:ct,maxWidth:ct,height:ct,maxHeight:ct,top:ct,right:ct,bottom:ct,left:ct,inset:ct,insetBlock:ct,insetBlockStart:ct,insetBlockEnd:ct,insetInline:ct,insetInlineStart:ct,insetInlineEnd:ct,padding:ct,paddingTop:ct,paddingRight:ct,paddingBottom:ct,paddingLeft:ct,paddingBlock:ct,paddingBlockStart:ct,paddingBlockEnd:ct,paddingInline:ct,paddingInlineStart:ct,paddingInlineEnd:ct,margin:ct,marginTop:ct,marginRight:ct,marginBottom:ct,marginLeft:ct,marginBlock:ct,marginBlockStart:ct,marginBlockEnd:ct,marginInline:ct,marginInlineStart:ct,marginInlineEnd:ct,fontSize:ct,backgroundPositionX:ct,backgroundPositionY:ct,...{rotate:Yc,rotateX:Yc,rotateY:Yc,rotateZ:Yc,scale:Zb,scaleX:Zb,scaleY:Zb,scaleZ:Zb,skew:Yc,skewX:Yc,skewY:Yc,distance:ct,translateX:ct,translateY:ct,translateZ:ct,x:ct,y:ct,z:ct,perspective:ct,transformPerspective:ct,opacity:y0,originX:QN,originY:QN,originZ:ct},zIndex:Nk,fillOpacity:y0,strokeOpacity:y0,numOctaves:Nk},gGe={...iT,color:li,backgroundColor:li,outlineColor:li,fill:li,stroke:li,borderColor:li,borderTopColor:li,borderRightColor:li,borderBottomColor:li,borderLeftColor:li,filter:tT,WebkitFilter:tT,mask:nT,WebkitMask:nT},kk=e=>gGe[e],yGe=new Set([tT,nT]);function Xk(e,t){let n=kk(e);return yGe.has(n)||(n=fs),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const bGe=new Set(["auto","none","0"]);function _Ge(e,t,n){let i=0,r;for(;i<e.length&&!r;){const o=e[i];typeof o=="string"&&!bGe.has(o)&&v0(o).values.length&&(r=e[i]),i++}if(r&&n)for(const o of t)e[o]=Xk(n,r)}class vGe extends BE{constructor(t,n,i,r,o){super(t,n,i,r,o,!0)}readKeyframes(){const{unresolvedKeyframes:t,element:n,name:i}=this;if(!n||!n.current)return;super.readKeyframes();for(let u=0;u<t.length;u++){let h=t[u];if(typeof h=="string"&&(h=h.trim(),xE(h))){const d=Rk(h,n.current);d!==void 0&&(t[u]=d),u===t.length-1&&(this.finalKeyframe=h)}}if(this.resolveNoneKeyframes(),!Lk.has(i)||t.length!==2)return;const[r,o]=t,s=zk(r),a=zk(o),c=KN(r),l=KN(o);if(c!==l&&Hc[i]){this.needsMeasurement=!0;return}if(s!==a)if(pk(s)&&pk(a))for(let u=0;u<t.length;u++){const h=t[u];typeof h=="string"&&(t[u]=parseFloat(h))}else Hc[i]&&(this.needsMeasurement=!0)}resolveNoneKeyframes(){const{unresolvedKeyframes:t,name:n}=this,i=[];for(let r=0;r<t.length;r++)(t[r]===null||dGe(t[r]))&&i.push(r);i.length&&_Ge(t,i,n)}measureInitialState(){const{element:t,unresolvedKeyframes:n,name:i}=this;if(!t||!t.current)return;i==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=Hc[i](t.measureViewportBox(),window.getComputedStyle(t.current)),n[0]=this.measuredOrigin;const r=n[n.length-1];r!==void 0&&t.getValue(i,r).jump(r,!1)}measureEndState(){const{element:t,name:n,unresolvedKeyframes:i}=this;if(!t||!t.current)return;const r=t.getValue(n);r&&r.jump(this.measuredOrigin,!1);const o=i.length-1,s=i[o];i[o]=Hc[n](t.measureViewportBox(),window.getComputedStyle(t.current)),s!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=s),this.removedTransforms?.length&&this.removedTransforms.forEach(([a,c])=>{t.getValue(a).set(c)}),this.resolveNoneKeyframes()}}const wGe=new Set(["opacity","clipPath","filter","transform"]);function Zk(e,t,n){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e=="string"){let i=document;const r=n?.[e]??i.querySelectorAll(e);return r?Array.from(r):[]}return Array.from(e).filter(i=>i!=null)}const Dk=(e,t)=>t&&typeof e=="number"?t.transform(e):e;function xGe(e){return MN(e)&&"offsetHeight"in e}const{schedule:rT}=YN(queueMicrotask,!1),ps={x:!1,y:!1};function Uk(){return ps.x||ps.y}function SGe(e){return e==="x"||e==="y"?ps[e]?null:(ps[e]=!0,()=>{ps[e]=!1}):ps.x||ps.y?null:(ps.x=ps.y=!0,()=>{ps.x=ps.y=!1})}function Wk(e,t){const n=Zk(e),i=new AbortController,r={passive:!0,...t,signal:i.signal};return[n,r,()=>i.abort()]}function EGe(e){return!(e.pointerType==="touch"||Uk())}function TGe(e,t,n={}){const[i,r,o]=Wk(e,n);return i.forEach(s=>{let a=!1,c=!1,l;const u=()=>{s.removeEventListener("pointerleave",p)},h=y=>{l&&(l(y),l=void 0),u()},d=y=>{a=!1,window.removeEventListener("pointerup",d),window.removeEventListener("pointercancel",d),c&&(c=!1,h(y))},f=()=>{a=!0,window.addEventListener("pointerup",d,r),window.addEventListener("pointercancel",d,r)},p=y=>{if(y.pointerType!=="touch"){if(a){c=!0;return}h(y)}},m=y=>{if(!EGe(y))return;c=!1;const g=t(s,y);typeof g=="function"&&(l=g,s.addEventListener("pointerleave",p,r))};s.addEventListener("pointerenter",m,r),s.addEventListener("pointerdown",f,r)}),o}const Bk=(e,t)=>t?e===t?!0:Bk(e,t.parentElement):!1,oT=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1,CGe=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function RGe(e){return CGe.has(e.tagName)||e.isContentEditable===!0}const IGe=new Set(["INPUT","SELECT","TEXTAREA"]);function MGe(e){return IGe.has(e.tagName)||e.isContentEditable===!0}const Bb=new WeakSet;function Yk(e){return t=>{t.key==="Enter"&&e(t)}}function sT(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary:!0,bubbles:!0}))}const LGe=(e,t)=>{const n=e.currentTarget;if(!n)return;const i=Yk(()=>{if(Bb.has(n))return;sT(n,"down");const r=Yk(()=>{sT(n,"up")}),o=()=>sT(n,"cancel");n.addEventListener("keyup",r,t),n.addEventListener("blur",o,t)});n.addEventListener("keydown",i,t),n.addEventListener("blur",()=>n.removeEventListener("keydown",i),t)};function Hk(e){return oT(e)&&!Uk()}const jk=new WeakSet;function PGe(e,t,n={}){const[i,r,o]=Wk(e,n),s=a=>{const c=a.currentTarget;if(!Hk(a)||jk.has(a))return;Bb.add(c),n.stopPropagation&&jk.add(a);const l=t(c,a),u=(f,p)=>{window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",d),Bb.has(c)&&Bb.delete(c),Hk(f)&&typeof l=="function"&&l(f,{success:p})},h=f=>{u(f,c===window||c===document||n.useGlobalTarget||Bk(c,f.target))},d=f=>{u(f,!1)};window.addEventListener("pointerup",h,r),window.addEventListener("pointercancel",d,r)};return i.forEach(a=>{(n.useGlobalTarget?window:a).addEventListener("pointerdown",s,r),xGe(a)&&(a.addEventListener("focus",l=>LGe(l,r)),!RGe(a)&&!a.hasAttribute("tabindex")&&(a.tabIndex=0))}),o}function aT(e){return MN(e)&&"ownerSVGElement"in e}const Yb=new WeakMap;let Hb;const Kk=(e,t,n)=>(i,r)=>r&&r[0]?r[0][e+"Size"]:aT(i)&&"getBBox"in i?i.getBBox()[t]:i[n],OGe=Kk("inline","width","offsetWidth"),GGe=Kk("block","height","offsetHeight");function VGe({target:e,borderBoxSize:t}){Yb.get(e)?.forEach(n=>{n(e,{get width(){return OGe(e,t)},get height(){return GGe(e,t)}})})}function FGe(e){e.forEach(VGe)}function AGe(){typeof ResizeObserver>"u"||(Hb=new ResizeObserver(FGe))}function zGe(e,t){Hb||AGe();const n=Zk(e);return n.forEach(i=>{let r=Yb.get(i);r||(r=new Set,Yb.set(i,r)),r.add(t),Hb?.observe(i)}),()=>{n.forEach(i=>{const r=Yb.get(i);r?.delete(t),r?.size||Hb?.unobserve(i)})}}const jb=new Set;let id;function NGe(){id=()=>{const e={get width(){return window.innerWidth},get height(){return window.innerHeight}};jb.forEach(t=>t(e))},window.addEventListener("resize",id)}function kGe(e){return jb.add(e),id||NGe(),()=>{jb.delete(e),!jb.size&&typeof id=="function"&&(window.removeEventListener("resize",id),id=void 0)}}function Jk(e,t){return typeof e=="function"?kGe(e):zGe(e,t)}function XGe(e){return aT(e)&&e.tagName==="svg"}const ZGe=[...Ak,li,fs],DGe=e=>ZGe.find(Fk(e)),Qk=()=>({translate:0,scale:1,origin:0,originPoint:0}),rd=()=>({x:Qk(),y:Qk()}),qk=()=>({min:0,max:0}),bi=()=>({x:qk(),y:qk()}),UGe=new WeakMap;function Kb(e){return e!==null&&typeof e=="object"&&typeof e.start=="function"}function x0(e){return typeof e=="string"||Array.isArray(e)}const cT=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],lT=["initial",...cT];function Jb(e){return Kb(e.animate)||lT.some(t=>x0(e[t]))}function $k(e){return!!(Jb(e)||e.variants)}function WGe(e,t,n){for(const i in t){const r=t[i],o=n[i];if(tr(r))e.addValue(i,r);else if(tr(o))e.addValue(i,tu(r,{owner:e}));else if(o!==r)if(e.hasValue(i)){const s=e.getValue(i);s.liveStyle===!0?s.jump(r):s.hasAnimated||s.set(r)}else{const s=e.getStaticValue(i);e.addValue(i,tu(s!==void 0?s:r,{owner:e}))}}for(const i in n)t[i]===void 0&&e.removeValue(i);return t}const uT={current:null},eX={current:!1},BGe=typeof window<"u";function YGe(){if(eX.current=!0,!!BGe)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>uT.current=e.matches;e.addEventListener("change",t),t()}else uT.current=!1}const tX=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let Qb={};function nX(e){Qb=e}function HGe(){return Qb}class jGe{scrapeMotionValuesFromProps(t,n,i){return{}}constructor({parent:t,props:n,presenceContext:i,reducedMotionConfig:r,skipAnimations:o,blockInitialAnimation:s,visualState:a},c={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=BE,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const f=yr.now();this.renderScheduledAt<f&&(this.renderScheduledAt=f,Tn.render(this.render,!1,!0))};const{latestValues:l,renderState:u}=a;this.latestValues=l,this.baseTarget={...l},this.initialValues=n.initial?{...l}:{},this.renderState=u,this.parent=t,this.props=n,this.presenceContext=i,this.depth=t?t.depth+1:0,this.reducedMotionConfig=r,this.skipAnimationsConfig=o,this.options=c,this.blockInitialAnimation=!!s,this.isControllingVariants=Jb(n),this.isVariantNode=$k(n),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:h,...d}=this.scrapeMotionValuesFromProps(n,{},this);for(const f in d){const p=d[f];l[f]!==void 0&&tr(p)&&p.set(l[f])}}mount(t){if(this.hasBeenMounted)for(const n in this.initialValues)this.values.get(n)?.jump(this.initialValues[n]),this.latestValues[n]=this.initialValues[n];this.current=t,UGe.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((n,i)=>this.bindToMotionValue(i,n)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:(eX.current||YGe(),this.shouldReduceMotion=uT.current),process.env.NODE_ENV!=="production"&&bE(this.shouldReduceMotion!==!0,"You have Reduced Motion enabled on your device. Animations may not appear as expected.","reduced-motion-disabled"),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,this.parent?.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){this.projection&&this.projection.unmount(),Bc(this.notifyUpdate),Bc(this.render),this.valueSubscriptions.forEach(t=>t()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const t in this.events)this.events[t].clear();for(const t in this.features){const n=this.features[t];n&&(n.unmount(),n.isMounted=!1)}this.current=null}addChild(t){this.children.add(t),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(t)}removeChild(t){this.children.delete(t),this.enteringChildren&&this.enteringChildren.delete(t)}bindToMotionValue(t,n){if(this.valueSubscriptions.has(t)&&this.valueSubscriptions.get(t)(),n.accelerate&&wGe.has(t)&&this.current instanceof HTMLElement){const{factory:s,keyframes:a,times:c,ease:l,duration:u}=n.accelerate,h=new Sk({element:this.current,name:t,keyframes:a,times:c,ease:l,duration:Fo(u)}),d=s(h);this.valueSubscriptions.set(t,()=>{d(),h.cancel()});return}const i=td.has(t);i&&this.onBindTransform&&this.onBindTransform();const r=n.on("change",s=>{this.latestValues[t]=s,this.props.onUpdate&&Tn.preRender(this.notifyUpdate),i&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let o;typeof window<"u"&&window.MotionCheckAppearSync&&(o=window.MotionCheckAppearSync(this,t,n)),this.valueSubscriptions.set(t,()=>{r(),o&&o(),n.owner&&n.stop()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}updateFeatures(){let t="animation";for(t in Qb){const n=Qb[t];if(!n)continue;const{isEnabled:i,Feature:r}=n;if(!this.features[t]&&r&&i(this.props)&&(this.features[t]=new r(this)),this.features[t]){const o=this.features[t];o.isMounted?o.update():(o.mount(),o.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):bi()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let i=0;i<tX.length;i++){const r=tX[i];this.propEventSubscriptions[r]&&(this.propEventSubscriptions[r](),delete this.propEventSubscriptions[r]);const o="on"+r,s=t[o];s&&(this.propEventSubscriptions[r]=this.on(r,s))}this.prevMotionValues=WGe(this,this.scrapeMotionValuesFromProps(t,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(t){return this.props.variants?this.props.variants[t]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(t){const n=this.getClosestVariantNode();if(n)return n.variantChildren&&n.variantChildren.add(t),()=>n.variantChildren.delete(t)}addValue(t,n){const i=this.values.get(t);n!==i&&(i&&this.removeValue(t),this.bindToMotionValue(t,n),this.values.set(t,n),this.latestValues[t]=n.get())}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let i=this.values.get(t);return i===void 0&&n!==void 0&&(i=tu(n===null?void 0:n,{owner:this}),this.addValue(t,i)),i}readValue(t,n){let i=this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.getBaseTargetFromProps(this.props,t)??this.readValueFromInstance(this.current,t,this.options);return i!=null&&(typeof i=="string"&&(IN(i)||LN(i))?i=parseFloat(i):!DGe(i)&&fs.test(n)&&(i=Xk(t,n)),this.setBaseTarget(t,tr(i)?i.get():i)),tr(i)?i.get():i}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){const{initial:n}=this.props;let i;if(typeof n=="string"||typeof n=="object"){const o=JE(this.props,n,this.presenceContext?.custom);o&&(i=o[t])}if(n&&i!==void 0)return i;const r=this.getBaseTargetFromProps(this.props,t);return r!==void 0&&!tr(r)?r:this.initialValues[t]!==void 0&&i===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new yE),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}scheduleRenderMicrotask(){rT.render(this.render)}}class iX extends jGe{constructor(){super(...arguments),this.KeyframeResolver=vGe}sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){const i=t.style;return i?i[n]:void 0}removeValueFromRenderState(t,{vars:n,style:i}){delete n[t],delete i[t]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;tr(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}}class jc{constructor(t){this.isMounted=!1,this.node=t}update(){}}function rX({top:e,left:t,right:n,bottom:i}){return{x:{min:t,max:n},y:{min:e,max:i}}}function KGe({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function JGe(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),i=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:i.y,right:i.x}}function hT(e){return e===void 0||e===1}function dT({scale:e,scaleX:t,scaleY:n}){return!hT(e)||!hT(t)||!hT(n)}function nu(e){return dT(e)||oX(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function oX(e){return sX(e.x)||sX(e.y)}function sX(e){return e&&e!=="0%"}function qb(e,t,n){const i=e-n,r=t*i;return n+r}function aX(e,t,n,i,r){return r!==void 0&&(e=qb(e,r,i)),qb(e,n,i)+t}function fT(e,t=0,n=1,i,r){e.min=aX(e.min,t,n,i,r),e.max=aX(e.max,t,n,i,r)}function cX(e,{x:t,y:n}){fT(e.x,t.translate,t.scale,t.originPoint),fT(e.y,n.translate,n.scale,n.originPoint)}const lX=.999999999999,uX=1.0000000000001;function QGe(e,t,n,i=!1){const r=n.length;if(!r)return;t.x=t.y=1;let o,s;for(let a=0;a<r;a++){o=n[a],s=o.projectionDelta;const{visualElement:c}=o.options;c&&c.props.style&&c.props.style.display==="contents"||(i&&o.options.layoutScroll&&o.scroll&&o!==o.root&&sd(e,{x:-o.scroll.offset.x,y:-o.scroll.offset.y}),s&&(t.x*=s.x.scale,t.y*=s.y.scale,cX(e,s)),i&&nu(o.latestValues)&&sd(e,o.latestValues))}t.x<uX&&t.x>lX&&(t.x=1),t.y<uX&&t.y>lX&&(t.y=1)}function od(e,t){e.min=e.min+t,e.max=e.max+t}function hX(e,t,n,i,r=.5){const o=Dn(e.min,e.max,r);fT(e,t,n,o,i)}function dX(e,t){return typeof e=="string"?parseFloat(e)/100*(t.max-t.min):e}function sd(e,t){hX(e.x,dX(t.x,e.x),t.scaleX,t.scale,t.originX),hX(e.y,dX(t.y,e.y),t.scaleY,t.scale,t.originY)}function fX(e,t){return rX(JGe(e.getBoundingClientRect(),t))}function qGe(e,t,n){const i=fX(e,n),{scroll:r}=t;return r&&(od(i.x,r.offset.x),od(i.y,r.offset.y)),i}const $Ge={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},eVe=ed.length;function tVe(e,t,n){let i="",r=!0;for(let o=0;o<eVe;o++){const s=ed[o],a=e[s];if(a===void 0)continue;let c=!0;if(typeof a=="number")c=a===(s.startsWith("scale")?1:0);else{const l=parseFloat(a);c=s.startsWith("scale")?l===1:l===0}if(!c||n){const l=Dk(a,iT[s]);if(!c){r=!1;const u=$Ge[s]||s;i+=`${u}(${l}) `}n&&(t[s]=l)}}return i=i.trim(),n?i=n(t,r?"":i):r&&(i="none"),i}function pT(e,t,n){const{style:i,vars:r,transformOrigin:o}=e;let s=!1,a=!1;for(const c in t){const l=t[c];if(td.has(c)){s=!0;continue}else if(jN(c)){r[c]=l;continue}else{const u=Dk(l,iT[c]);c.startsWith("origin")?(a=!0,o[c]=u):i[c]=u}}if(t.transform||(s||n?i.transform=tVe(t,e.transform,n):i.transform&&(i.transform="none")),a){const{originX:c="50%",originY:l="50%",originZ:u=0}=o;i.transformOrigin=`${c} ${l} ${u}`}}function pX(e,{style:t,vars:n},i,r){const o=e.style;let s;for(s in t)o[s]=t[s];r?.applyProjectionStyles(o,i);for(s in n)o.setProperty(s,n[s])}function mX(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const S0={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(ct.test(e))e=parseFloat(e);else return e;const n=mX(e,t.target.x),i=mX(e,t.target.y);return`${n}% ${i}%`}},nVe={correct:(e,{treeScale:t,projectionDelta:n})=>{const i=e,r=fs.parse(e);if(r.length>5)return i;const o=fs.createTransformer(e),s=typeof r[0]!="number"?1:0,a=n.x.scale*t.x,c=n.y.scale*t.y;r[0+s]/=a,r[1+s]/=c;const l=Dn(a,c,.5);return typeof r[2+s]=="number"&&(r[2+s]/=l),typeof r[3+s]=="number"&&(r[3+s]/=l),o(r)}},mT={borderRadius:{...S0,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:S0,borderTopRightRadius:S0,borderBottomLeftRadius:S0,borderBottomRightRadius:S0,boxShadow:nVe};function gX(e,{layout:t,layoutId:n}){return td.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!mT[e]||e==="opacity")}function gT(e,t,n){const i=e.style,r=t?.style,o={};if(!i)return o;for(const s in i)(tr(i[s])||r&&tr(r[s])||gX(s,e)||n?.getValue(s)?.liveStyle!==void 0)&&(o[s]=i[s]);return o}function iVe(e){return window.getComputedStyle(e)}class rVe extends iX{constructor(){super(...arguments),this.type="html",this.renderInstance=pX}readValueFromInstance(t,n){if(td.has(n))return this.projection?.isProjecting?XE(n):EOe(t,n);{const i=iVe(t),r=(jN(n)?i.getPropertyValue(n):i[n])||0;return typeof r=="string"?r.trim():r}}measureInstanceViewportBox(t,{transformPagePoint:n}){return fX(t,n)}build(t,n,i){pT(t,n,i.transformTemplate)}scrapeMotionValuesFromProps(t,n,i){return gT(t,n,i)}}const oVe={offset:"stroke-dashoffset",array:"stroke-dasharray"},sVe={offset:"strokeDashoffset",array:"strokeDasharray"};function aVe(e,t,n=1,i=0,r=!0){e.pathLength=1;const o=r?oVe:sVe;e[o.offset]=`${-i}`,e[o.array]=`${t} ${n}`}const cVe=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function yX(e,{attrX:t,attrY:n,attrScale:i,pathLength:r,pathSpacing:o=1,pathOffset:s=0,...a},c,l,u){if(pT(e,a,l),c){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:h,style:d}=e;h.transform&&(d.transform=h.transform,delete h.transform),(d.transform||h.transformOrigin)&&(d.transformOrigin=h.transformOrigin??"50% 50%",delete h.transformOrigin),d.transform&&(d.transformBox=u?.transformBox??"fill-box",delete h.transformBox);for(const f of cVe)h[f]!==void 0&&(d[f]=h[f],delete h[f]);t!==void 0&&(h.x=t),n!==void 0&&(h.y=n),i!==void 0&&(h.scale=i),r!==void 0&&aVe(h,r,o,s,!1)}const bX=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),_X=e=>typeof e=="string"&&e.toLowerCase()==="svg";function lVe(e,t,n,i){pX(e,t,void 0,i);for(const r in t.attrs)e.setAttribute(bX.has(r)?r:$E(r),t.attrs[r])}function vX(e,t,n){const i=gT(e,t,n);for(const r in e)if(tr(e[r])||tr(t[r])){const o=ed.indexOf(r)!==-1?"attr"+r.charAt(0).toUpperCase()+r.substring(1):r;i[o]=e[r]}return i}class uVe extends iX{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=bi}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(td.has(n)){const i=kk(n);return i&&i.default||0}return n=bX.has(n)?n:$E(n),t.getAttribute(n)}scrapeMotionValuesFromProps(t,n,i){return vX(t,n,i)}build(t,n,i){yX(t,n,this.isSVGTag,i.transformTemplate,i.style)}renderInstance(t,n,i,r){lVe(t,n,i,r)}mount(t){this.isSVGTag=_X(t.tagName),super.mount(t)}}const hVe=lT.length;function wX(e){if(!e)return;if(!e.isControllingVariants){const n=e.parent?wX(e.parent)||{}:{};return e.props.initial!==void 0&&(n.initial=e.props.initial),n}const t={};for(let n=0;n<hVe;n++){const i=lT[n],r=e.props[i];(x0(r)||r===!1)&&(t[i]=r)}return t}function xX(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let i=0;i<n;i++)if(t[i]!==e[i])return!1;return!0}const dVe=[...cT].reverse(),fVe=cT.length;function pVe(e){return t=>Promise.all(t.map(({animation:n,options:i})=>uGe(e,n,i)))}function mVe(e){let t=pVe(e),n=SX(),i=!0,r=!1;const o=l=>(u,h)=>{const d=nd(e,h,l==="exit"?e.presenceContext?.custom:void 0);if(d){const{transition:f,transitionEnd:p,...m}=d;u={...u,...m,...p}}return u};function s(l){t=l(e)}function a(l){const{props:u}=e,h=wX(e.parent)||{},d=[],f=new Set;let p={},m=1/0;for(let g=0;g<fVe;g++){const v=dVe[g],S=n[v],T=u[v]!==void 0?u[v]:h[v],C=x0(T),O=v===l?S.isActive:null;O===!1&&(m=g);let V=T===h[v]&&T!==u[v]&&C;if(V&&(i||r)&&e.manuallyAnimateOnMount&&(V=!1),S.protectedKeys={...p},!S.isActive&&O===null||!T&&!S.prevProp||Kb(T)||typeof T=="boolean")continue;if(v==="exit"&&S.isActive&&O!==!0){S.prevResolvedValues&&(p={...p,...S.prevResolvedValues});continue}const A=gVe(S.prevProp,T);let G=A||v===l&&S.isActive&&!V&&C||g>m&&C,k=!1;const N=Array.isArray(T)?T:[T];let P=N.reduce(o(v),{});O===!1&&(P={});const{prevResolvedValues:w={}}=S,x={...w,...P},I=Y=>{G=!0,f.has(Y)&&(k=!0,f.delete(Y)),S.needsAnimating[Y]=!0;const H=e.getValue(Y);H&&(H.liveStyle=!1)};for(const Y in x){const H=P[Y],J=w[Y];if(p.hasOwnProperty(Y))continue;let z=!1;QE(H)&&QE(J)?z=!xX(H,J):z=H!==J,z?H!=null?I(Y):f.add(Y):H!==void 0&&f.has(Y)?I(Y):S.protectedKeys[Y]=!0}S.prevProp=T,S.prevResolvedValues=P,S.isActive&&(p={...p,...P}),(i||r)&&e.blockInitialAnimation&&(G=!1);const X=V&&A;G&&(!X||k)&&d.push(...N.map(Y=>{const H={type:v};if(typeof Y=="string"&&(i||r)&&!X&&e.manuallyAnimateOnMount&&e.parent){const{parent:J}=e,z=nd(J,Y);if(J.enteringChildren&&z){const{delayChildren:W}=z.transition||{};H.delay=Ck(J.enteringChildren,e,W)}}return{animation:Y,options:H}}))}if(f.size){const g={};if(typeof u.initial!="boolean"){const v=nd(e,Array.isArray(u.initial)?u.initial[0]:u.initial);v&&v.transition&&(g.transition=v.transition)}f.forEach(v=>{const S=e.getBaseTarget(v),T=e.getValue(v);T&&(T.liveStyle=!0),g[v]=S??null}),d.push({animation:g})}let y=!!d.length;return i&&(u.initial===!1||u.initial===u.animate)&&!e.manuallyAnimateOnMount&&(y=!1),i=!1,r=!1,y?t(d):Promise.resolve()}function c(l,u){if(n[l].isActive===u)return Promise.resolve();e.variantChildren?.forEach(d=>d.animationState?.setActive(l,u)),n[l].isActive=u;const h=a(l);for(const d in n)n[d].protectedKeys={};return h}return{animateChanges:a,setActive:c,setAnimateFunction:s,getState:()=>n,reset:()=>{n=SX(),r=!0}}}function gVe(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!xX(t,e):!1}function iu(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function SX(){return{animate:iu(!0),whileInView:iu(),whileHover:iu(),whileTap:iu(),whileDrag:iu(),whileFocus:iu(),exit:iu()}}function EX(e,t){e.min=t.min,e.max=t.max}function ms(e,t){EX(e.x,t.x),EX(e.y,t.y)}function TX(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}const CX=1e-4,yVe=1-CX,bVe=1+CX,RX=.01,_Ve=0-RX,vVe=0+RX;function br(e){return e.max-e.min}function wVe(e,t,n){return Math.abs(e-t)<=n}function IX(e,t,n,i=.5){e.origin=i,e.originPoint=Dn(t.min,t.max,e.origin),e.scale=br(n)/br(t),e.translate=Dn(n.min,n.max,e.origin)-e.originPoint,(e.scale>=yVe&&e.scale<=bVe||isNaN(e.scale))&&(e.scale=1),(e.translate>=_Ve&&e.translate<=vVe||isNaN(e.translate))&&(e.translate=0)}function E0(e,t,n,i){IX(e.x,t.x,n.x,i?i.originX:void 0),IX(e.y,t.y,n.y,i?i.originY:void 0)}function MX(e,t,n){e.min=n.min+t.min,e.max=e.min+br(t)}function xVe(e,t,n){MX(e.x,t.x,n.x),MX(e.y,t.y,n.y)}function LX(e,t,n){e.min=t.min-n.min,e.max=e.min+br(t)}function $b(e,t,n){LX(e.x,t.x,n.x),LX(e.y,t.y,n.y)}function PX(e,t,n,i,r){return e-=t,e=qb(e,1/n,i),r!==void 0&&(e=qb(e,1/r,i)),e}function SVe(e,t=0,n=1,i=.5,r,o=e,s=e){if(na.test(t)&&(t=parseFloat(t),t=Dn(s.min,s.max,t/100)-s.min),typeof t!="number")return;let a=Dn(o.min,o.max,i);e===o&&(a-=t),e.min=PX(e.min,t,n,a,r),e.max=PX(e.max,t,n,a,r)}function OX(e,t,[n,i,r],o,s){SVe(e,t[n],t[i],t[r],t.scale,o,s)}const EVe=["x","scaleX","originX"],TVe=["y","scaleY","originY"];function GX(e,t,n,i){OX(e.x,t,EVe,n?n.x:void 0,i?i.x:void 0),OX(e.y,t,TVe,n?n.y:void 0,i?i.y:void 0)}function VX(e){return e.translate===0&&e.scale===1}function FX(e){return VX(e.x)&&VX(e.y)}function AX(e,t){return e.min===t.min&&e.max===t.max}function CVe(e,t){return AX(e.x,t.x)&&AX(e.y,t.y)}function zX(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function NX(e,t){return zX(e.x,t.x)&&zX(e.y,t.y)}function kX(e){return br(e.x)/br(e.y)}function XX(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function ia(e){return[e("x"),e("y")]}function RVe(e,t,n){let i="";const r=e.x.translate/t.x,o=e.y.translate/t.y,s=n?.z||0;if((r||o||s)&&(i=`translate3d(${r}px, ${o}px, ${s}px) `),(t.x!==1||t.y!==1)&&(i+=`scale(${1/t.x}, ${1/t.y}) `),n){const{transformPerspective:l,rotate:u,rotateX:h,rotateY:d,skewX:f,skewY:p}=n;l&&(i=`perspective(${l}px) ${i}`),u&&(i+=`rotate(${u}deg) `),h&&(i+=`rotateX(${h}deg) `),d&&(i+=`rotateY(${d}deg) `),f&&(i+=`skewX(${f}deg) `),p&&(i+=`skewY(${p}deg) `)}const a=e.x.scale*t.x,c=e.y.scale*t.y;return(a!==1||c!==1)&&(i+=`scale(${a}, ${c})`),i||"none"}const ZX=["TopLeft","TopRight","BottomLeft","BottomRight"],IVe=ZX.length,DX=e=>typeof e=="string"?parseFloat(e):e,UX=e=>typeof e=="number"||ct.test(e);function MVe(e,t,n,i,r,o){r?(e.opacity=Dn(0,n.opacity??1,LVe(i)),e.opacityExit=Dn(t.opacity??1,0,PVe(i))):o&&(e.opacity=Dn(t.opacity??1,n.opacity??1,i));for(let s=0;s<IVe;s++){const a=`border${ZX[s]}Radius`;let c=WX(t,a),l=WX(n,a);if(c===void 0&&l===void 0)continue;c||(c=0),l||(l=0),c===0||l===0||UX(c)===UX(l)?(e[a]=Math.max(Dn(DX(c),DX(l),i),0),(na.test(l)||na.test(c))&&(e[a]+="%")):e[a]=l}(t.rotate||n.rotate)&&(e.rotate=Dn(t.rotate||0,n.rotate||0,i))}function WX(e,t){return e[t]!==void 0?e[t]:e.borderRadius}const LVe=BX(0,.5,XN),PVe=BX(.5,.95,Vo);function BX(e,t,n){return i=>i<e?0:i>t?1:n(m0(e,t,i))}function OVe(e,t,n){const i=tr(e)?e:tu(e);return i.start(KE("",i,t,n)),i.animation}function T0(e,t,n,i={passive:!0}){return e.addEventListener(t,n,i),()=>e.removeEventListener(t,n)}const GVe=(e,t)=>e.depth-t.depth;class VVe{constructor(){this.children=[],this.isDirty=!1}add(t){mE(this.children,t),this.isDirty=!0}remove(t){Nb(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(GVe),this.isDirty=!1,this.children.forEach(t)}}function FVe(e,t){const n=yr.now(),i=({timestamp:r})=>{const o=r-n;o>=t&&(Bc(i),e(o-t))};return Tn.setup(i,!0),()=>Bc(i)}function e1(e){return tr(e)?e.get():e}class AVe{constructor(){this.members=[]}add(t){mE(this.members,t);for(let n=this.members.length-1;n>=0;n--){const i=this.members[n];if(i===t||i===this.lead||i===this.prevLead)continue;const r=i.instance;(!r||r.isConnected===!1)&&!i.snapshot&&(Nb(this.members,i),i.unmount())}t.scheduleRender()}remove(t){if(Nb(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){for(let n=this.members.indexOf(t)-1;n>=0;n--){const i=this.members[n];if(i.isPresent!==!1&&i.instance?.isConnected!==!1)return this.promote(i),!0}return!1}promote(t,n){const i=this.lead;if(t!==i&&(this.prevLead=i,this.lead=t,t.show(),i)){i.updateSnapshot(),t.scheduleRender();const{layoutDependency:r}=i.options,{layoutDependency:o}=t.options;(r===void 0||r!==o)&&(t.resumeFrom=i,n&&(i.preserveOpacity=!0),i.snapshot&&(t.snapshot=i.snapshot,t.snapshot.latestValues=i.animationValues||i.latestValues),t.root?.isUpdating&&(t.isLayoutDirty=!0)),t.options.crossfade===!1&&i.hide()}}exitAnimationComplete(){this.members.forEach(t=>{t.options.onExitComplete?.(),t.resumingFrom?.options.onExitComplete?.()})}scheduleRender(){this.members.forEach(t=>t.instance&&t.scheduleRender(!1))}removeLeadSnapshot(){this.lead?.snapshot&&(this.lead.snapshot=void 0)}}const t1={hasAnimatedSinceResize:!0,hasEverUpdated:!1},yT=["","X","Y","Z"],zVe=1e3;let NVe=0;function bT(e,t,n,i){const{latestValues:r}=t;r[e]&&(n[e]=r[e],t.setStaticValue(e,0),i&&(i[e]=0))}function YX(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;const{visualElement:t}=e.options;if(!t)return;const n=Gk(t);if(window.MotionHasOptimisedAnimation(n,"transform")){const{layout:r,layoutId:o}=e.options;window.MotionCancelOptimisedAnimation(n,"transform",Tn,!(r||o))}const{parent:i}=e;i&&!i.hasCheckedOptimisedAppear&&YX(i)}function HX({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:i,resetTransform:r}){return class{constructor(s={},a=t?.()){this.id=NVe++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(ZVe),this.nodes.forEach(BVe),this.nodes.forEach(YVe),this.nodes.forEach(DVe)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=s,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let c=0;c<this.path.length;c++)this.path[c].shouldResetTransform=!0;this.root===this&&(this.nodes=new VVe)}addEventListener(s,a){return this.eventHandlers.has(s)||this.eventHandlers.set(s,new yE),this.eventHandlers.get(s).add(a)}notifyListeners(s,...a){const c=this.eventHandlers.get(s);c&&c.notify(...a)}hasListeners(s){return this.eventHandlers.has(s)}mount(s){if(this.instance)return;this.isSVG=aT(s)&&!XGe(s),this.instance=s;const{layoutId:a,layout:c,visualElement:l}=this.options;if(l&&!l.current&&l.mount(s),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(c||a)&&(this.isLayoutDirty=!0),e){let u,h=0;const d=()=>this.root.updateBlockedByResize=!1;Tn.read(()=>{h=window.innerWidth}),e(s,()=>{const f=window.innerWidth;f!==h&&(h=f,this.root.updateBlockedByResize=!0,u&&u(),u=FVe(d,250),t1.hasAnimatedSinceResize&&(t1.hasAnimatedSinceResize=!1,this.nodes.forEach(JX)))})}a&&this.root.registerSharedNode(a,this),this.options.animate!==!1&&l&&(a||c)&&this.addEventListener("didUpdate",({delta:u,hasLayoutChanged:h,hasRelativeLayoutChanged:d,layout:f})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const p=this.options.transition||l.getDefaultTransition()||QVe,{onLayoutAnimationStart:m,onLayoutAnimationComplete:y}=l.getProps(),g=!this.targetLayout||!NX(this.targetLayout,f),v=!h&&d;if(this.options.layoutRoot||this.resumeFrom||v||h&&(g||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const S={...jE(p,"layout"),onPlay:m,onComplete:y};(l.shouldReduceMotion||this.options.layoutRoot)&&(S.delay=0,S.type=!1),this.startAnimation(S),this.setAnimationOrigin(u,v)}else h||JX(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=f})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const s=this.getStack();s&&s.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),Bc(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(HVe),this.animationId++)}getTransformTemplate(){const{visualElement:s}=this.options;return s&&s.getProps().transformTemplate}willUpdate(s=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&YX(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let u=0;u<this.path.length;u++){const h=this.path[u];h.shouldResetTransform=!0,h.updateScroll("snapshot"),h.options.layoutRoot&&h.willUpdate(!1)}const{layoutId:a,layout:c}=this.options;if(a===void 0&&!c)return;const l=this.getTransformTemplate();this.prevTransformTemplateValue=l?l(this.latestValues,""):void 0,this.updateSnapshot(),s&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(jX);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(KX);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach(WVe),this.nodes.forEach(kVe),this.nodes.forEach(XVe)):this.nodes.forEach(KX),this.clearAllSnapshots();const a=yr.now();zi.delta=ta(0,1e3/60,a-zi.timestamp),zi.timestamp=a,zi.isProcessing=!0,wE.update.process(zi),wE.preRender.process(zi),wE.render.process(zi),zi.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,rT.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(UVe),this.sharedNodes.forEach(jVe)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,Tn.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){Tn.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!br(this.snapshot.measuredBox.x)&&!br(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let c=0;c<this.path.length;c++)this.path[c].updateScroll();const s=this.layout;this.layout=this.measure(!1),this.layoutVersion++,this.layoutCorrected=bi(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:a}=this.options;a&&a.notify("LayoutMeasure",this.layout.layoutBox,s?s.layoutBox:void 0)}updateScroll(s="measure"){let a=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===s&&(a=!1),a&&this.instance){const c=i(this.instance);this.scroll={animationId:this.root.animationId,phase:s,isRoot:c,offset:n(this.instance),wasRoot:this.scroll?this.scroll.isRoot:c}}}resetTransform(){if(!r)return;const s=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,a=this.projectionDelta&&!FX(this.projectionDelta),c=this.getTransformTemplate(),l=c?c(this.latestValues,""):void 0,u=l!==this.prevTransformTemplateValue;s&&this.instance&&(a||nu(this.latestValues)||u)&&(r(this.instance,l),this.shouldResetTransform=!1,this.scheduleRender())}measure(s=!0){const a=this.measurePageBox();let c=this.removeElementScroll(a);return s&&(c=this.removeTransform(c)),qVe(c),{animationId:this.root.animationId,measuredBox:a,layoutBox:c,latestValues:{},source:this.id}}measurePageBox(){const{visualElement:s}=this.options;if(!s)return bi();const a=s.measureViewportBox();if(!(this.scroll?.wasRoot||this.path.some($Ve))){const{scroll:l}=this.root;l&&(od(a.x,l.offset.x),od(a.y,l.offset.y))}return a}removeElementScroll(s){const a=bi();if(ms(a,s),this.scroll?.wasRoot)return a;for(let c=0;c<this.path.length;c++){const l=this.path[c],{scroll:u,options:h}=l;l!==this.root&&u&&h.layoutScroll&&(u.wasRoot&&ms(a,s),od(a.x,u.offset.x),od(a.y,u.offset.y))}return a}applyTransform(s,a=!1){const c=bi();ms(c,s);for(let l=0;l<this.path.length;l++){const u=this.path[l];!a&&u.options.layoutScroll&&u.scroll&&u!==u.root&&sd(c,{x:-u.scroll.offset.x,y:-u.scroll.offset.y}),nu(u.latestValues)&&sd(c,u.latestValues)}return nu(this.latestValues)&&sd(c,this.latestValues),c}removeTransform(s){const a=bi();ms(a,s);for(let c=0;c<this.path.length;c++){const l=this.path[c];if(!l.instance||!nu(l.latestValues))continue;dT(l.latestValues)&&l.updateSnapshot();const u=bi(),h=l.measurePageBox();ms(u,h),GX(a,l.latestValues,l.snapshot?l.snapshot.layoutBox:void 0,u)}return nu(this.latestValues)&&GX(a,this.latestValues),a}setTargetDelta(s){this.targetDelta=s,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(s){this.options={...this.options,...s,crossfade:s.crossfade!==void 0?s.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==zi.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(s=!1){const a=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=a.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=a.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=a.isSharedProjectionDirty);const c=!!this.resumingFrom||this!==a;if(!(s||c&&this.isSharedProjectionDirty||this.isProjectionDirty||this.parent?.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;const{layout:u,layoutId:h}=this.options;if(!this.layout||!(u||h))return;this.resolvedRelativeTargetAt=zi.timestamp;const d=this.getClosestProjectingParent();d&&this.linkedParentVersion!==d.layoutVersion&&!d.options.layoutRoot&&this.removeRelativeTarget(),!this.targetDelta&&!this.relativeTarget&&(d&&d.layout?this.createRelativeTarget(d,this.layout.layoutBox,d.layout.layoutBox):this.removeRelativeTarget()),!(!this.relativeTarget&&!this.targetDelta)&&(this.target||(this.target=bi(),this.targetWithTransforms=bi()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),xVe(this.target,this.relativeTarget,this.relativeParent.target)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):ms(this.target,this.layout.layoutBox),cX(this.target,this.targetDelta)):ms(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,d&&!!d.resumingFrom==!!this.resumingFrom&&!d.options.layoutScroll&&d.target&&this.animationProgress!==1?this.createRelativeTarget(d,this.target,d.target):this.relativeParent=this.relativeTarget=void 0))}getClosestProjectingParent(){if(!(!this.parent||dT(this.parent.latestValues)||oX(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(s,a,c){this.relativeParent=s,this.linkedParentVersion=s.layoutVersion,this.forceRelativeParentToResolveTarget(),this.relativeTarget=bi(),this.relativeTargetOrigin=bi(),$b(this.relativeTargetOrigin,a,c),ms(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){const s=this.getLead(),a=!!this.resumingFrom||this!==s;let c=!0;if((this.isProjectionDirty||this.parent?.isProjectionDirty)&&(c=!1),a&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(c=!1),this.resolvedRelativeTargetAt===zi.timestamp&&(c=!1),c)return;const{layout:l,layoutId:u}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(l||u))return;ms(this.layoutCorrected,this.layout.layoutBox);const h=this.treeScale.x,d=this.treeScale.y;QGe(this.layoutCorrected,this.treeScale,this.path,a),s.layout&&!s.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(s.target=s.layout.layoutBox,s.targetWithTransforms=bi());const{target:f}=s;if(!f){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(TX(this.prevProjectionDelta.x,this.projectionDelta.x),TX(this.prevProjectionDelta.y,this.projectionDelta.y)),E0(this.projectionDelta,this.layoutCorrected,f,this.latestValues),(this.treeScale.x!==h||this.treeScale.y!==d||!XX(this.projectionDelta.x,this.prevProjectionDelta.x)||!XX(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",f))}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(s=!0){if(this.options.visualElement?.scheduleRender(),s){const a=this.getStack();a&&a.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=rd(),this.projectionDelta=rd(),this.projectionDeltaWithTransform=rd()}setAnimationOrigin(s,a=!1){const c=this.snapshot,l=c?c.latestValues:{},u={...this.latestValues},h=rd();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!a;const d=bi(),f=c?c.source:void 0,p=this.layout?this.layout.source:void 0,m=f!==p,y=this.getStack(),g=!y||y.members.length<=1,v=!!(m&&!g&&this.options.crossfade===!0&&!this.path.some(JVe));this.animationProgress=0;let S;this.mixTargetDelta=T=>{const C=T/1e3;QX(h.x,s.x,C),QX(h.y,s.y,C),this.setTargetDelta(h),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&($b(d,this.layout.layoutBox,this.relativeParent.layout.layoutBox),KVe(this.relativeTarget,this.relativeTargetOrigin,d,C),S&&CVe(this.relativeTarget,S)&&(this.isProjectionDirty=!1),S||(S=bi()),ms(S,this.relativeTarget)),m&&(this.animationValues=u,MVe(u,l,this.latestValues,C,v,g)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=C},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(s){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(Bc(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=Tn.update(()=>{t1.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=tu(0)),this.motionValue.jump(0,!1),this.currentAnimation=OVe(this.motionValue,[0,1e3],{...s,velocity:0,isSync:!0,onUpdate:a=>{this.mixTargetDelta(a),s.onUpdate&&s.onUpdate(a)},onStop:()=>{},onComplete:()=>{s.onComplete&&s.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const s=this.getStack();s&&s.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(zVe),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const s=this.getLead();let{targetWithTransforms:a,target:c,layout:l,latestValues:u}=s;if(!(!a||!c||!l)){if(this!==s&&this.layout&&l&&nZ(this.options.animationType,this.layout.layoutBox,l.layoutBox)){c=this.target||bi();const h=br(this.layout.layoutBox.x);c.x.min=s.target.x.min,c.x.max=c.x.min+h;const d=br(this.layout.layoutBox.y);c.y.min=s.target.y.min,c.y.max=c.y.min+d}ms(a,c),sd(a,u),E0(this.projectionDeltaWithTransform,this.layoutCorrected,a,u)}}registerSharedNode(s,a){this.sharedNodes.has(s)||this.sharedNodes.set(s,new AVe),this.sharedNodes.get(s).add(a);const l=a.options.initialPromotionConfig;a.promote({transition:l?l.transition:void 0,preserveFollowOpacity:l&&l.shouldPreserveFollowOpacity?l.shouldPreserveFollowOpacity(a):void 0})}isLead(){const s=this.getStack();return s?s.lead===this:!0}getLead(){const{layoutId:s}=this.options;return s?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:s}=this.options;return s?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:s}=this.options;if(s)return this.root.sharedNodes.get(s)}promote({needsReset:s,transition:a,preserveFollowOpacity:c}={}){const l=this.getStack();l&&l.promote(this,c),s&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const s=this.getStack();return s?s.relegate(this):!1}resetSkewAndRotation(){const{visualElement:s}=this.options;if(!s)return;let a=!1;const{latestValues:c}=s;if((c.z||c.rotate||c.rotateX||c.rotateY||c.rotateZ||c.skewX||c.skewY)&&(a=!0),!a)return;const l={};c.z&&bT("z",s,l,this.animationValues);for(let u=0;u<yT.length;u++)bT(`rotate${yT[u]}`,s,l,this.animationValues),bT(`skew${yT[u]}`,s,l,this.animationValues);s.render();for(const u in l)s.setStaticValue(u,l[u]),this.animationValues&&(this.animationValues[u]=l[u]);s.scheduleRender()}applyProjectionStyles(s,a){if(!this.instance||this.isSVG)return;if(!this.isVisible){s.visibility="hidden";return}const c=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,s.visibility="",s.opacity="",s.pointerEvents=e1(a?.pointerEvents)||"",s.transform=c?c(this.latestValues,""):"none";return}const l=this.getLead();if(!this.projectionDelta||!this.layout||!l.target){this.options.layoutId&&(s.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,s.pointerEvents=e1(a?.pointerEvents)||""),this.hasProjected&&!nu(this.latestValues)&&(s.transform=c?c({},""):"none",this.hasProjected=!1);return}s.visibility="";const u=l.animationValues||l.latestValues;this.applyTransformsToTarget();let h=RVe(this.projectionDeltaWithTransform,this.treeScale,u);c&&(h=c(u,h)),s.transform=h;const{x:d,y:f}=this.projectionDelta;s.transformOrigin=`${d.origin*100}% ${f.origin*100}% 0`,l.animationValues?s.opacity=l===this?u.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:u.opacityExit:s.opacity=l===this?u.opacity!==void 0?u.opacity:"":u.opacityExit!==void 0?u.opacityExit:0;for(const p in mT){if(u[p]===void 0)continue;const{correct:m,applyTo:y,isCSSVariable:g}=mT[p],v=h==="none"?u[p]:m(u[p],l);if(y){const S=y.length;for(let T=0;T<S;T++)s[y[T]]=v}else g?this.options.visualElement.renderState.vars[p]=v:s[p]=v}this.options.layoutId&&(s.pointerEvents=l===this?e1(a?.pointerEvents)||"":"none")}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(s=>s.currentAnimation?.stop()),this.root.nodes.forEach(jX),this.root.sharedNodes.clear()}}}function kVe(e){e.updateLayout()}function XVe(e){const t=e.resumeFrom?.snapshot||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners("didUpdate")){const{layoutBox:n,measuredBox:i}=e.layout,{animationType:r}=e.options,o=t.source!==e.layout.source;r==="size"?ia(u=>{const h=o?t.measuredBox[u]:t.layoutBox[u],d=br(h);h.min=n[u].min,h.max=h.min+d}):nZ(r,t.layoutBox,n)&&ia(u=>{const h=o?t.measuredBox[u]:t.layoutBox[u],d=br(n[u]);h.max=h.min+d,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[u].max=e.relativeTarget[u].min+d)});const s=rd();E0(s,n,t.layoutBox);const a=rd();o?E0(a,e.applyTransform(i,!0),t.measuredBox):E0(a,n,t.layoutBox);const c=!FX(s);let l=!1;if(!e.resumeFrom){const u=e.getClosestProjectingParent();if(u&&!u.resumeFrom){const{snapshot:h,layout:d}=u;if(h&&d){const f=bi();$b(f,t.layoutBox,h.layoutBox);const p=bi();$b(p,n,d.layoutBox),NX(f,p)||(l=!0),u.options.layoutRoot&&(e.relativeTarget=p,e.relativeTargetOrigin=f,e.relativeParent=u)}}}e.notifyListeners("didUpdate",{layout:n,snapshot:t,delta:a,layoutDelta:s,hasLayoutChanged:c,hasRelativeLayoutChanged:l})}else if(e.isLead()){const{onExitComplete:n}=e.options;n&&n()}e.options.transition=void 0}function ZVe(e){e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function DVe(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function UVe(e){e.clearSnapshot()}function jX(e){e.clearMeasurements()}function KX(e){e.isLayoutDirty=!1}function WVe(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function JX(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function BVe(e){e.resolveTargetDelta()}function YVe(e){e.calcProjection()}function HVe(e){e.resetSkewAndRotation()}function jVe(e){e.removeLeadSnapshot()}function QX(e,t,n){e.translate=Dn(t.translate,0,n),e.scale=Dn(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function qX(e,t,n,i){e.min=Dn(t.min,n.min,i),e.max=Dn(t.max,n.max,i)}function KVe(e,t,n,i){qX(e.x,t.x,n.x,i),qX(e.y,t.y,n.y,i)}function JVe(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const QVe={duration:.45,ease:[.4,0,.1,1]},$X=e=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),eZ=$X("applewebkit/")&&!$X("chrome/")?Math.round:Vo;function tZ(e){e.min=eZ(e.min),e.max=eZ(e.max)}function qVe(e){tZ(e.x),tZ(e.y)}function nZ(e,t,n){return e==="position"||e==="preserve-aspect"&&!wVe(kX(t),kX(n),.2)}function $Ve(e){return e!==e.root&&e.scroll?.wasRoot}const e9e=HX({attachResizeListener:(e,t)=>T0(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body?.scrollLeft||0,y:document.documentElement.scrollTop||document.body?.scrollTop||0}),checkIsScrollRoot:()=>!0}),_T={current:void 0},iZ=HX({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!_T.current){const e=new e9e({});e.mount(window),e.setOptions({layoutScroll:!0}),_T.current=e}return _T.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),vT=R.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"});function t9e(e=!0){const t=R.useContext(pE);if(t===null)return[!0,null];const{isPresent:n,onExitComplete:i,register:r}=t,o=R.useId();R.useEffect(()=>{if(e)return r(o)},[e]);const s=R.useCallback(()=>e&&i&&i(o),[o,i,e]);return!n&&i?[!1,s]:[!0]}const rZ=R.createContext({strict:!1}),oZ={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let sZ=!1;function n9e(){if(sZ)return;const e={};for(const t in oZ)e[t]={isEnabled:n=>oZ[t].some(i=>!!n[i])};nX(e),sZ=!0}function aZ(){return n9e(),HGe()}function i9e(e){const t=aZ();for(const n in e)t[n]={...t[n],...e[n]};nX(t)}const r9e=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","propagate","ignoreStrict","viewport"]);function n1(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||e.startsWith("onLayout")||r9e.has(e)}let cZ=e=>!n1(e);function o9e(e){typeof e=="function"&&(cZ=t=>t.startsWith("on")?!n1(t):e(t))}try{o9e(require("@emotion/is-prop-valid").default)}catch{}function s9e(e,t,n){const i={};for(const r in e)r==="values"&&typeof e.values=="object"||(cZ(r)||n===!0&&n1(r)||!t&&!n1(r)||e.draggable&&r.startsWith("onDrag"))&&(i[r]=e[r]);return i}const i1=R.createContext({});function a9e(e,t){if(Jb(e)){const{initial:n,animate:i}=e;return{initial:n===!1||x0(n)?n:void 0,animate:x0(i)?i:void 0}}return e.inherit!==!1?t:{}}function c9e(e){const{initial:t,animate:n}=a9e(e,R.useContext(i1));return R.useMemo(()=>({initial:t,animate:n}),[lZ(t),lZ(n)])}function lZ(e){return Array.isArray(e)?e.join(" "):e}const wT=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function uZ(e,t,n){for(const i in t)!tr(t[i])&&!gX(i,n)&&(e[i]=t[i])}function l9e({transformTemplate:e},t){return R.useMemo(()=>{const n=wT();return pT(n,t,e),Object.assign({},n.vars,n.style)},[t])}function u9e(e,t){const n=e.style||{},i={};return uZ(i,n,e),Object.assign(i,l9e(e,t)),i}function h9e(e,t){const n={},i=u9e(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,i.userSelect=i.WebkitUserSelect=i.WebkitTouchCallout="none",i.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=i,n}const hZ=()=>({...wT(),attrs:{}});function d9e(e,t,n,i){const r=R.useMemo(()=>{const o=hZ();return yX(o,t,_X(i),e.transformTemplate,e.style),{...o.attrs,style:{...o.style}}},[t]);if(e.style){const o={};uZ(o,e.style,e),r.style={...o,...r.style}}return r}const f9e=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function xT(e){return typeof e!="string"||e.includes("-")?!1:!!(f9e.indexOf(e)>-1||/[A-Z]/u.test(e))}function p9e(e,t,n,{latestValues:i},r,o=!1,s){const c=(s??xT(e)?d9e:h9e)(t,i,r,e),l=s9e(t,typeof e=="string",o),u=e!==R.Fragment?{...l,...c,ref:n}:{},{children:h}=t,d=R.useMemo(()=>tr(h)?h.get():h,[h]);return R.createElement(e,{...u,children:d})}function m9e({scrapeMotionValuesFromProps:e,createRenderState:t},n,i,r){return{latestValues:g9e(n,i,r,e),renderState:t()}}function g9e(e,t,n,i){const r={},o=i(e,{});for(const d in o)r[d]=e1(o[d]);let{initial:s,animate:a}=e;const c=Jb(e),l=$k(e);t&&l&&!c&&e.inherit!==!1&&(s===void 0&&(s=t.initial),a===void 0&&(a=t.animate));let u=n?n.initial===!1:!1;u=u||s===!1;const h=u?a:s;if(h&&typeof h!="boolean"&&!Kb(h)){const d=Array.isArray(h)?h:[h];for(let f=0;f<d.length;f++){const p=JE(e,d[f]);if(p){const{transitionEnd:m,transition:y,...g}=p;for(const v in g){let S=g[v];if(Array.isArray(S)){const T=u?S.length-1:0;S=S[T]}S!==null&&(r[v]=S)}for(const v in m)r[v]=m[v]}}}return r}const dZ=e=>(t,n)=>{const i=R.useContext(i1),r=R.useContext(pE),o=()=>m9e(e,t,i,r);return n?o():RN(o)},y9e=dZ({scrapeMotionValuesFromProps:gT,createRenderState:wT}),b9e=dZ({scrapeMotionValuesFromProps:vX,createRenderState:hZ}),_9e=Symbol.for("motionComponentSymbol");function v9e(e,t,n){const i=R.useRef(n);R.useInsertionEffect(()=>{i.current=n});const r=R.useRef(null);return R.useCallback(o=>{o&&e.onMount?.(o);const s=i.current;if(typeof s=="function")if(o){const a=s(o);typeof a=="function"&&(r.current=a)}else r.current?(r.current(),r.current=null):s(o);else s&&(s.current=o);t&&(o?t.mount(o):t.unmount())},[t])}const fZ=R.createContext({});function ad(e){return e&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function w9e(e,t,n,i,r,o){const{visualElement:s}=R.useContext(i1),a=R.useContext(rZ),c=R.useContext(pE),l=R.useContext(vT),u=l.reducedMotion,h=l.skipAnimations,d=R.useRef(null),f=R.useRef(!1);i=i||a.renderer,!d.current&&i&&(d.current=i(e,{visualState:t,parent:s,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:u,skipAnimations:h,isSVG:o}),f.current&&d.current&&(d.current.manuallyAnimateOnMount=!0));const p=d.current,m=R.useContext(fZ);p&&!p.projection&&r&&(p.type==="html"||p.type==="svg")&&x9e(d.current,n,r,m);const y=R.useRef(!1);R.useInsertionEffect(()=>{p&&y.current&&p.update(n,c)});const g=n[Ok],v=R.useRef(!!g&&typeof window<"u"&&!window.MotionHandoffIsComplete?.(g)&&window.MotionHasOptimisedAnimation?.(g));return xPe(()=>{f.current=!0,p&&(y.current=!0,window.MotionIsMounted=!0,p.updateFeatures(),p.scheduleRenderMicrotask(),v.current&&p.animationState&&p.animationState.animateChanges())}),R.useEffect(()=>{p&&(!v.current&&p.animationState&&p.animationState.animateChanges(),v.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(g)}),v.current=!1),p.enteringChildren=void 0)}),p}function x9e(e,t,n,i){const{layoutId:r,layout:o,drag:s,dragConstraints:a,layoutScroll:c,layoutRoot:l,layoutCrossfade:u}=t;e.projection=new n(e.latestValues,t["data-framer-portal-id"]?void 0:pZ(e.parent)),e.projection.setOptions({layoutId:r,layout:o,alwaysMeasureLayout:!!s||a&&ad(a),visualElement:e,animationType:typeof o=="string"?o:"both",initialPromotionConfig:i,crossfade:u,layoutScroll:c,layoutRoot:l})}function pZ(e){if(e)return e.options.allowProjection!==!1?e.projection:pZ(e.parent)}function ST(e,{forwardMotionProps:t=!1,type:n}={},i,r){i&&i9e(i);const o=n?n==="svg":xT(e),s=o?b9e:y9e;function a(l,u){let h;const d={...R.useContext(vT),...l,layoutId:S9e(l)},{isStatic:f}=d,p=c9e(l),m=s(l,f);if(!f&&typeof window<"u"){E9e(d,i);const y=T9e(d);h=y.MeasureLayout,p.visualElement=w9e(e,m,d,r,y.ProjectionNode,o)}return ce.jsxs(i1.Provider,{value:p,children:[h&&p.visualElement?ce.jsx(h,{visualElement:p.visualElement,...d}):null,p9e(e,l,v9e(m,p.visualElement,u),m,f,t,o)]})}a.displayName=`motion.${typeof e=="string"?e:`create(${e.displayName??e.name??""})`}`;const c=R.forwardRef(a);return c[_9e]=e,c}function S9e({layoutId:e}){const t=R.useContext(CN).id;return t&&e!==void 0?t+"-"+e:e}function E9e(e,t){const n=R.useContext(rZ).strict;if(process.env.NODE_ENV!=="production"&&t&&n){const i="You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.";e.ignoreStrict?Jh(!1,i,"lazy-strict-mode"):Da(!1,i,"lazy-strict-mode")}}function T9e(e){const t=aZ(),{drag:n,layout:i}=t;if(!n&&!i)return{};const r={...n,...i};return{MeasureLayout:n?.isEnabled(e)||i?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function C9e(e,t){if(typeof Proxy>"u")return ST;const n=new Map,i=(o,s)=>ST(o,s,e,t),r=(o,s)=>(process.env.NODE_ENV!=="production"&&bE(!1,"motion() is deprecated. Use motion.create() instead."),i(o,s));return new Proxy(r,{get:(o,s)=>s==="create"?i:(n.has(s)||n.set(s,ST(s,void 0,e,t)),n.get(s))})}const R9e=(e,t)=>t.isSVG??xT(e)?new uVe(t):new rVe(t,{allowProjection:e!==R.Fragment});class I9e extends jc{constructor(t){super(t),t.animationState||(t.animationState=mVe(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();Kb(t)&&(this.unmountControls=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let M9e=0;class L9e extends jc{constructor(){super(...arguments),this.id=M9e++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const r=this.node.animationState.setActive("exit",!t);n&&!t&&r.then(()=>{n(this.id)})}mount(){const{register:t,onExitComplete:n}=this.node.presenceContext||{};n&&n(this.id),t&&(this.unmount=t(this.id))}unmount(){}}const P9e={animation:{Feature:I9e},exit:{Feature:L9e}};function C0(e){return{point:{x:e.pageX,y:e.pageY}}}const O9e=e=>t=>oT(t)&&e(t,C0(t));function R0(e,t,n,i){return T0(e,t,O9e(n),i)}const mZ=({current:e})=>e?e.ownerDocument.defaultView:null,gZ=(e,t)=>Math.abs(e-t);function G9e(e,t){const n=gZ(e.x,t.x),i=gZ(e.y,t.y);return Math.sqrt(n**2+i**2)}const yZ=new Set(["auto","scroll"]);class bZ{constructor(t,n,{transformPagePoint:i,contextWindow:r=window,dragSnapToOrigin:o=!1,distanceThreshold:s=3,element:a}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=f=>{this.handleScroll(f.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const f=TT(this.lastMoveEventInfo,this.history),p=this.startEvent!==null,m=G9e(f.offset,{x:0,y:0})>=this.distanceThreshold;if(!p&&!m)return;const{point:y}=f,{timestamp:g}=zi;this.history.push({...y,timestamp:g});const{onStart:v,onMove:S}=this.handlers;p||(v&&v(this.lastMoveEvent,f),this.startEvent=this.lastMoveEvent),S&&S(this.lastMoveEvent,f)},this.handlePointerMove=(f,p)=>{this.lastMoveEvent=f,this.lastMoveEventInfo=ET(p,this.transformPagePoint),Tn.update(this.updatePoint,!0)},this.handlePointerUp=(f,p)=>{this.end();const{onEnd:m,onSessionEnd:y,resumeAnimation:g}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&g&&g(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const v=TT(f.type==="pointercancel"?this.lastMoveEventInfo:ET(p,this.transformPagePoint),this.history);this.startEvent&&m&&m(f,v),y&&y(f,v)},!oT(t))return;this.dragSnapToOrigin=o,this.handlers=n,this.transformPagePoint=i,this.distanceThreshold=s,this.contextWindow=r||window;const c=C0(t),l=ET(c,this.transformPagePoint),{point:u}=l,{timestamp:h}=zi;this.history=[{...u,timestamp:h}];const{onSessionStart:d}=n;d&&d(t,TT(l,this.history)),this.removeListeners=p0(R0(this.contextWindow,"pointermove",this.handlePointerMove),R0(this.contextWindow,"pointerup",this.handlePointerUp),R0(this.contextWindow,"pointercancel",this.handlePointerUp)),a&&this.startScrollTracking(a)}startScrollTracking(t){let n=t.parentElement;for(;n;){const i=getComputedStyle(n);(yZ.has(i.overflowX)||yZ.has(i.overflowY))&&this.scrollPositions.set(n,{x:n.scrollLeft,y:n.scrollTop}),n=n.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0}),window.addEventListener("scroll",this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(t){const n=this.scrollPositions.get(t);if(!n)return;const i=t===window,r=i?{x:window.scrollX,y:window.scrollY}:{x:t.scrollLeft,y:t.scrollTop},o={x:r.x-n.x,y:r.y-n.y};o.x===0&&o.y===0||(i?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=o.x,this.lastMoveEventInfo.point.y+=o.y):this.history.length>0&&(this.history[0].x-=o.x,this.history[0].y-=o.y),this.scrollPositions.set(t,r),Tn.update(this.updatePoint,!0))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),Bc(this.updatePoint)}}function ET(e,t){return t?{point:t(e.point)}:e}function _Z(e,t){return{x:e.x-t.x,y:e.y-t.y}}function TT({point:e},t){return{point:e,delta:_Z(e,vZ(t)),offset:_Z(e,V9e(t)),velocity:F9e(t,.1)}}function V9e(e){return e[0]}function vZ(e){return e[e.length-1]}function F9e(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,i=null;const r=vZ(e);for(;n>=0&&(i=e[n],!(r.timestamp-i.timestamp>Fo(t)));)n--;if(!i)return{x:0,y:0};i===e[0]&&e.length>2&&r.timestamp-i.timestamp>Fo(t)*2&&(i=e[1]);const o=Ao(r.timestamp-i.timestamp);if(o===0)return{x:0,y:0};const s={x:(r.x-i.x)/o,y:(r.y-i.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function A9e(e,{min:t,max:n},i){return t!==void 0&&e<t?e=i?Dn(t,e,i.min):Math.max(e,t):n!==void 0&&e>n&&(e=i?Dn(n,e,i.max):Math.min(e,n)),e}function wZ(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function z9e(e,{top:t,left:n,bottom:i,right:r}){return{x:wZ(e.x,n,r),y:wZ(e.y,t,i)}}function xZ(e,t){let n=t.min-e.min,i=t.max-e.max;return t.max-t.min<e.max-e.min&&([n,i]=[i,n]),{min:n,max:i}}function N9e(e,t){return{x:xZ(e.x,t.x),y:xZ(e.y,t.y)}}function k9e(e,t){let n=.5;const i=br(e),r=br(t);return r>i?n=m0(t.min,t.max-i,e.min):i>r&&(n=m0(e.min,e.max-r,t.min)),ta(0,1,n)}function X9e(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const CT=.35;function Z9e(e=CT){return e===!1?e=0:e===!0&&(e=CT),{x:SZ(e,"left","right"),y:SZ(e,"top","bottom")}}function SZ(e,t,n){return{min:EZ(e,t),max:EZ(e,n)}}function EZ(e,t){return typeof e=="number"?e:e[t]||0}const D9e=new WeakMap;class U9e{constructor(t){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=bi(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=t}start(t,{snapToCursor:n=!1,distanceThreshold:i}={}){const{presenceContext:r}=this.visualElement;if(r&&r.isPresent===!1)return;const o=h=>{n&&this.snapToCursor(C0(h).point),this.stopAnimation()},s=(h,d)=>{const{drag:f,dragPropagation:p,onDragStart:m}=this.getProps();if(f&&!p&&(this.openDragLock&&this.openDragLock(),this.openDragLock=SGe(f),!this.openDragLock))return;this.latestPointerEvent=h,this.latestPanInfo=d,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),ia(g=>{let v=this.getAxisMotionValue(g).get()||0;if(na.test(v)){const{projection:S}=this.visualElement;if(S&&S.layout){const T=S.layout.layoutBox[g];T&&(v=br(T)*(parseFloat(v)/100))}}this.originPoint[g]=v}),m&&Tn.update(()=>m(h,d),!1,!0),qE(this.visualElement,"transform");const{animationState:y}=this.visualElement;y&&y.setActive("whileDrag",!0)},a=(h,d)=>{this.latestPointerEvent=h,this.latestPanInfo=d;const{dragPropagation:f,dragDirectionLock:p,onDirectionLock:m,onDrag:y}=this.getProps();if(!f&&!this.openDragLock)return;const{offset:g}=d;if(p&&this.currentDirection===null){this.currentDirection=B9e(g),this.currentDirection!==null&&m&&m(this.currentDirection);return}this.updateAxis("x",d.point,g),this.updateAxis("y",d.point,g),this.visualElement.render(),y&&Tn.update(()=>y(h,d),!1,!0)},c=(h,d)=>{this.latestPointerEvent=h,this.latestPanInfo=d,this.stop(h,d),this.latestPointerEvent=null,this.latestPanInfo=null},l=()=>{const{dragSnapToOrigin:h}=this.getProps();(h||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:u}=this.getProps();this.panSession=new bZ(t,{onSessionStart:o,onStart:s,onMove:a,onSessionEnd:c,resumeAnimation:l},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:u,distanceThreshold:i,contextWindow:mZ(this.visualElement),element:this.visualElement.current})}stop(t,n){const i=t||this.latestPointerEvent,r=n||this.latestPanInfo,o=this.isDragging;if(this.cancel(),!o||!r||!i)return;const{velocity:s}=r;this.startAnimation(s);const{onDragEnd:a}=this.getProps();a&&Tn.postRender(()=>a(i,r))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:i}=this.getProps();!i&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),n&&n.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(t,n,i){const{drag:r}=this.getProps();if(!i||!r1(t,r,this.currentDirection))return;const o=this.getAxisMotionValue(t);let s=this.originPoint[t]+i[t];this.constraints&&this.constraints[t]&&(s=A9e(s,this.constraints[t],this.elastic[t])),o.set(s)}resolveConstraints(){const{dragConstraints:t,dragElastic:n}=this.getProps(),i=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,r=this.constraints;t&&ad(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&i?this.constraints=z9e(i.layoutBox,t):this.constraints=!1,this.elastic=Z9e(n),r!==this.constraints&&!ad(t)&&i&&this.constraints&&!this.hasMutatedConstraints&&ia(o=>{this.constraints!==!1&&this.getAxisMotionValue(o)&&(this.constraints[o]=X9e(i.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!ad(t))return!1;const i=t.current;Da(i!==null,"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.","drag-constraints-ref");const{projection:r}=this.visualElement;if(!r||!r.layout)return!1;const o=qGe(i,r.root,this.visualElement.getTransformPagePoint());let s=N9e(r.layout.layoutBox,o);if(n){const a=n(KGe(s));this.hasMutatedConstraints=!!a,a&&(s=rX(a))}return s}startAnimation(t){const{drag:n,dragMomentum:i,dragElastic:r,dragTransition:o,dragSnapToOrigin:s,onDragTransitionEnd:a}=this.getProps(),c=this.constraints||{},l=ia(u=>{if(!r1(u,n,this.currentDirection))return;let h=c&&c[u]||{};s&&(h={min:0,max:0});const d=r?200:1e6,f=r?40:1e7,p={type:"inertia",velocity:i?t[u]:0,bounceStiffness:d,bounceDamping:f,timeConstant:750,restDelta:1,restSpeed:10,...o,...h};return this.startAxisValueAnimation(u,p)});return Promise.all(l).then(a)}startAxisValueAnimation(t,n){const i=this.getAxisMotionValue(t);return qE(this.visualElement,t),i.start(KE(t,i,0,n,this.visualElement,!1))}stopAnimation(){ia(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const n=`_drag${t.toUpperCase()}`,i=this.visualElement.getProps(),r=i[n];return r||this.visualElement.getValue(t,(i.initial?i.initial[t]:void 0)||0)}snapToCursor(t){ia(n=>{const{drag:i}=this.getProps();if(!r1(n,i,this.currentDirection))return;const{projection:r}=this.visualElement,o=this.getAxisMotionValue(n);if(r&&r.layout){const{min:s,max:a}=r.layout.layoutBox[n],c=o.get()||0;o.set(t[n]-Dn(s,a,.5)+c)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:i}=this.visualElement;if(!ad(n)||!i||!this.constraints)return;this.stopAnimation();const r={x:0,y:0};ia(s=>{const a=this.getAxisMotionValue(s);if(a&&this.constraints!==!1){const c=a.get();r[s]=k9e({min:c,max:c},this.constraints[s])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",i.root&&i.root.updateScroll(),i.updateLayout(),this.constraints=!1,this.resolveConstraints(),ia(s=>{if(!r1(s,t,null))return;const a=this.getAxisMotionValue(s),{min:c,max:l}=this.constraints[s];a.set(Dn(c,l,r[s]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;D9e.set(this.visualElement,this);const t=this.visualElement.current,n=R0(t,"pointerdown",l=>{const{drag:u,dragListener:h=!0}=this.getProps(),d=l.target,f=d!==t&&MGe(d);u&&h&&!f&&this.start(l)});let i;const r=()=>{const{dragConstraints:l}=this.getProps();ad(l)&&l.current&&(this.constraints=this.resolveRefConstraints(),i||(i=W9e(t,l.current,()=>this.scalePositionWithinConstraints())))},{projection:o}=this.visualElement,s=o.addEventListener("measure",r);o&&!o.layout&&(o.root&&o.root.updateScroll(),o.updateLayout()),Tn.read(r);const a=T0(window,"resize",()=>this.scalePositionWithinConstraints()),c=o.addEventListener("didUpdate",(({delta:l,hasLayoutChanged:u})=>{this.isDragging&&u&&(ia(h=>{const d=this.getAxisMotionValue(h);d&&(this.originPoint[h]+=l[h].translate,d.set(d.get()+l[h].translate))}),this.visualElement.render())}));return()=>{a(),n(),s(),c&&c(),i&&i()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:i=!1,dragPropagation:r=!1,dragConstraints:o=!1,dragElastic:s=CT,dragMomentum:a=!0}=t;return{...t,drag:n,dragDirectionLock:i,dragPropagation:r,dragConstraints:o,dragElastic:s,dragMomentum:a}}}function TZ(e){let t=!0;return()=>{if(t){t=!1;return}e()}}function W9e(e,t,n){const i=Jk(e,TZ(n)),r=Jk(t,TZ(n));return()=>{i(),r()}}function r1(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function B9e(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class Y9e extends jc{constructor(t){super(t),this.removeGroupControls=Vo,this.removeListeners=Vo,this.controls=new U9e(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Vo}update(){const{dragControls:t}=this.node.getProps(),{dragControls:n}=this.node.prevProps||{};t!==n&&(this.removeGroupControls(),t&&(this.removeGroupControls=t.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}}const RT=e=>(t,n)=>{e&&Tn.update(()=>e(t,n),!1,!0)};class H9e extends jc{constructor(){super(...arguments),this.removePointerDownListener=Vo}onPointerDown(t){this.session=new bZ(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:mZ(this.node)})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:i,onPanEnd:r}=this.node.getProps();return{onSessionStart:RT(t),onStart:RT(n),onMove:RT(i),onEnd:(o,s)=>{delete this.session,r&&Tn.postRender(()=>r(o,s))}}}mount(){this.removePointerDownListener=R0(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let IT=!1;class j9e extends R.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:i,layoutId:r}=this.props,{projection:o}=t;o&&(n.group&&n.group.add(o),i&&i.register&&r&&i.register(o),IT&&o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),t1.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:i,drag:r,isPresent:o}=this.props,{projection:s}=i;return s&&(s.isPresent=o,t.layoutDependency!==n&&s.setOptions({...s.options,layoutDependency:n}),IT=!0,r||t.layoutDependency!==n||n===void 0||t.isPresent!==o?s.willUpdate():this.safeToRemove(),t.isPresent!==o&&(o?s.promote():s.relegate()||Tn.postRender(()=>{const a=s.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),rT.postRender(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:i}=this.props,{projection:r}=t;IT=!0,r&&(r.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(r),i&&i.deregister&&i.deregister(r))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function CZ(e){const[t,n]=t9e(),i=R.useContext(CN);return ce.jsx(j9e,{...e,layoutGroup:i,switchLayoutGroup:R.useContext(fZ),isPresent:t,safeToRemove:n})}const K9e={pan:{Feature:H9e},drag:{Feature:Y9e,ProjectionNode:iZ,MeasureLayout:CZ}};function RZ(e,t,n){const{props:i}=e;e.animationState&&i.whileHover&&e.animationState.setActive("whileHover",n==="Start");const r="onHover"+n,o=i[r];o&&Tn.postRender(()=>o(t,C0(t)))}class J9e extends jc{mount(){const{current:t}=this.node;t&&(this.unmount=TGe(t,(n,i)=>(RZ(this.node,i,"Start"),r=>RZ(this.node,r,"End"))))}unmount(){}}class Q9e extends jc{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=p0(T0(this.node.current,"focus",()=>this.onFocus()),T0(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function IZ(e,t,n){const{props:i}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&i.whileTap&&e.animationState.setActive("whileTap",n==="Start");const r="onTap"+(n==="End"?"":n),o=i[r];o&&Tn.postRender(()=>o(t,C0(t)))}class q9e extends jc{mount(){const{current:t}=this.node;if(!t)return;const{globalTapTarget:n,propagate:i}=this.node.props;this.unmount=PGe(t,(r,o)=>(IZ(this.node,o,"Start"),(s,{success:a})=>IZ(this.node,s,a?"End":"Cancel")),{useGlobalTarget:n,stopPropagation:i?.tap===!1})}unmount(){}}const MT=new WeakMap,LT=new WeakMap,$9e=e=>{const t=MT.get(e.target);t&&t(e)},eFe=e=>{e.forEach($9e)};function tFe({root:e,...t}){const n=e||document;LT.has(n)||LT.set(n,{});const i=LT.get(n),r=JSON.stringify(t);return i[r]||(i[r]=new IntersectionObserver(eFe,{root:e,...t})),i[r]}function nFe(e,t,n){const i=tFe(t);return MT.set(e,n),i.observe(e),()=>{MT.delete(e),i.unobserve(e)}}const iFe={some:0,all:1};class rFe extends jc{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:n,margin:i,amount:r="some",once:o}=t,s={root:n?n.current:void 0,rootMargin:i,threshold:typeof r=="number"?r:iFe[r]},a=c=>{const{isIntersecting:l}=c;if(this.isInView===l||(this.isInView=l,o&&!l&&this.hasEnteredView))return;l&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",l);const{onViewportEnter:u,onViewportLeave:h}=this.node.getProps(),d=l?u:h;d&&d(c)};return nFe(this.node.current,s,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(oFe(t,n))&&this.startObserver()}unmount(){}}function oFe({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const sFe={...P9e,...{inView:{Feature:rFe},tap:{Feature:q9e},focus:{Feature:Q9e},hover:{Feature:J9e}},...K9e,...{layout:{ProjectionNode:iZ,MeasureLayout:CZ}}},aFe=C9e(sFe,R9e);function MZ(e){const t=RN(()=>tu(e)),{isStatic:n}=R.useContext(vT);if(n){const[,i]=R.useState(e);R.useEffect(()=>t.on("change",i),[])}return t}function PT(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function cFe(e,t){var n=R.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(i){var r=n.value;r!==i&&(n.value=i,n.callback(i,r))}}}})[0];return n.callback=t,n.facade}var lFe=typeof window<"u"?F0.useLayoutEffect:F0.useEffect,LZ=new WeakMap;function uFe(e,t){var n=cFe(null,function(i){return e.forEach(function(r){return PT(r,i)})});return lFe(function(){var i=LZ.get(n);if(i){var r=new Set(i),o=new Set(e),s=n.current;r.forEach(function(a){o.has(a)||PT(a,null)}),o.forEach(function(a){r.has(a)||PT(a,s)})}LZ.set(n,e)},[e]),n}const hFe=new rs(rt.WGS84,b.ZERO),OT=R.forwardRef(({position:e,children:t,...n},i)=>{const r=Xo(()=>new b);e?.clone(r);const o=MZ(""),s=MZ("none"),{toWindowPosition:a,getCamera:c,toXYZ:l,isPositionVisible:u}=ai(),h=R.useRef(null);Gl(()=>{if(h.current==null)return;let f;try{const v=a?.([r.x,r.y,r.z]);f=new me(v?.[0],v?.[1])}catch{s.set("none");return}const p=c?.();if(!p)return;const m=l?.(p?.lng,p?.lat,p?.height);if(!m)return;if(hFe.cameraPosition=new b(m[0],m[1],m[2]),f==null||f.x<0||f.y<0||f.x>window.innerWidth||f.y>window.innerHeight||!u?.([r.x,r.y,r.z])){s.set("none");return}const y=`calc(${f.x}px - 50%)`,g=`calc(${f.y}px - 50%)`;o.set(`translate(${y}, ${g})`),s.set("block")});const d=uFe([h,i]);return ce.jsx(aFe.div,{ref:d,...n,style:{...n.style,transform:o,display:s,position:"absolute",pointerEvents:"none",left:0,top:0},children:t})});OT.displayName="ScreenSpaceElement";const dFe=({a:e,b:t,color:n})=>{const i=R.useRef([e,t]);i.current=[e,t];const r=Xo(()=>new yo(()=>i.current,!1)),o=R.useMemo(()=>({polyline:{positions:r,width:1.5,material:new Ol({color:n,dashLength:8})}}),[n,r]);return ce.jsx(f0,{...o})},fFe=({a:e,b:t,extrudedHeight:n,color:i,showLine:r})=>{const o=Xo(()=>new b);return ce.jsxs(ce.Fragment,{children:[ce.jsx(OT,{position:b.midpoint(e,t,o),children:ce.jsx(TN,{children:n<1e3?`${n.toFixed(1)} m`:`${(n/1e3).toFixed(1)} km`})}),r&&ce.jsx(dFe,{a:e,b:t,color:i})]})},PZ=R.memo(({geometryOptions:{controlPoints:e,type:t},extrudedHeight:n,color:i,isEditing:r,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedExtrudedPoint:c,handleControlPointMouseEvent:l})=>{const u=e[e.length-1],h=o?new b(...o):void 0,d=s?new b(...s):void 0,f=a?new b(...a):void 0;return ce.jsxs(ce.Fragment,{children:[h&&ce.jsxs(ce.Fragment,{children:[ce.jsx(d0,{index:-1,position:h,isEditing:r,isExtrudedControlPoint:!0,handleControlPointMouseEvent:l}),(!r||c)&&ce.jsx(fFe,{a:u,b:h,extrudedHeight:n,color:r?B.fromCssColorString(h0):i,showLine:t!=="extrudedPolygon"})]}),d&&ce.jsx(d0,{index:-1,position:d,isEditing:r,isExtrudedControlPoint:!0}),f&&ce.jsx(d0,{index:-1,position:f,isEditing:r,isExtrudedControlPoint:!0})]})});PZ.displayName="ExtrudedControlPoints";const pFe=({id:e,hierarchy:t,extrudedHeight:n,color:i,disableShadow:r=!1,isEditing:o})=>{const s=R.useRef(t);s.current=t;const c=Xo(()=>new yo(()=>s.current,!1)),l=R.useRef(n);l.current=n;const h=Xo(()=>new yo(()=>l.current,!1)),d=R.useMemo(()=>({polygon:{hierarchy:c,heightReference:vl.RELATIVE_TO_TERRAIN,extrudedHeight:h,extrudedHeightReference:vl.RELATIVE_TO_TERRAIN,fill:!0,outline:!0,outlineWidth:1,outlineColor:o?B.fromCssColorString(h0):i?.withAlpha(1),material:new Rl(o?i?.withAlpha(.2):i),classificationType:Kr.TERRAIN,shadows:r?Zf.DISABLED:Zf.ENABLED}}),[h,r,c,i,o]),{requestRender:f}=ai();return f?.(),ce.jsx(f0,{id:e,...d})},mFe=({dynamic:e=!1,hierarchy:t,color:n})=>{const i=R.useRef(t);i.current=t;const r=Xo(()=>new yo(()=>i.current,!1)),o=e?r:t,s=R.useMemo(()=>({polygon:{hierarchy:o,fill:!0,material:n?.withAlpha(.5),classificationType:Kr.TERRAIN}}),[n,o]),{requestRender:a}=ai();return a?.(),ce.jsx(f0,{...s})},gFe=({dynamic:e=!1,positions:t,color:n,isEditing:i})=>{const r=R.useRef(t);r.current=t;const o=Xo(()=>new yo(()=>r.current,!e)),s=e?o:t,a=R.useMemo(()=>({polyline:{positions:s,width:1.5,material:i?B.fromCssColorString(h0):n,classificationType:Kr.TERRAIN,clampToGround:!0}}),[n,s,i]),{requestRender:c}=ai();return c?.(),ce.jsx(f0,{...a})},OZ=new b,GZ=R.memo(({geometryOptions:{type:e,controlPoints:t},isEditing:n,handleAddControlPoint:i})=>{if(!["polyline","polygon","extrudedPolygon"].includes(e))return null;const r=[];for(let o=0;o<t.length-1;o++){const s=t[o+1],a=b.midpoint(t[o],s,OZ);r.push(a.clone())}if(e==="polygon"||e==="extrudedPolygon"){const o=b.midpoint(t[t.length-1],t[0],OZ);r.push(o.clone())}return ce.jsx(ce.Fragment,{children:r.map((o,s)=>ce.jsx(d0,{position:o,isAddingPoint:!0,index:s,clampToGround:!0,isEditing:n,handleControlPointMouseEvent:()=>i?.([o.x,o.y,o.z],s)},s))})});GZ.displayName="SurfaceAddingPoints";const yFe=({a:e,b:t,color:n})=>{const i=R.useRef([e,t]);i.current=[e,t];const r=Xo(()=>new yo(()=>i.current,!1)),o=R.useMemo(()=>({polyline:{positions:r,width:1.5,material:new Ol({color:n,dashLength:8}),classificationType:Kr.TERRAIN,clampToGround:!0}}),[n,r]),{requestRender:s}=ai();return s?.(),ce.jsx(f0,{...o})},bFe=({a:e,b:t,color:n,showLine:i=!1})=>{const r=Xo(()=>new b),{getSurfaceDistance:o}=ai(),s=o?.(e,t);return s!==void 0?ce.jsxs(ce.Fragment,{children:[ce.jsx(OT,{position:b.midpoint(e,t,r),children:ce.jsx(TN,{children:s<1e3?`${s.toFixed(1)} m`:`${(s/1e3).toFixed(1)} km`})}),i&&ce.jsx(yFe,{a:e,b:t,color:n})]}):null},VZ=new b,FZ=R.memo(({geometryOptions:{type:e,controlPoints:t},color:n,isEditing:i,catchedControlPointIndex:r,selectedControlPointIndex:o,handleControlPointMouseEvent:s})=>{const a=[];if(t.length>=2)if(i){if(r!==void 0&&r!==-1)switch(e){case"polyline":r>0&&a.push({points:[t[r-1],t[r]],showLine:!1}),r<t.length-1&&a.push({points:[t[r],t[r+1]],showLine:!1});break;case"circle":case"extrudedCircle":r!==2&&a.push({points:[t[0],t[1]],showLine:!0});break;case"rectangle":case"extrudedRectangle":if(r<=1)a.push({points:[t[0],t[1]],showLine:!1});else if(r===2){const[c,l,u]=t,h=b.midpoint(c,l,VZ);a.push({points:[h,u],showLine:!0})}break;case"polygon":case"extrudedPolygon":a.push({points:[t[r],r===0?t[t.length-1]:t[r-1]],showLine:!1}),a.push({points:[t[r],r===t.length-1?t[0]:t[r+1]],showLine:!1});break}}else switch(e){case"rectangle":case"extrudedRectangle":if(t.length===2)a.push({points:t,showLine:!0});else if(t.length===3){const[c,l,u]=t,h=b.midpoint(c,l,VZ);a.push({points:[h,u],showLine:!0})}break;default:a.push({points:t.slice(-2),showLine:e==="circle"});break}return ce.jsxs(ce.Fragment,{children:[t.map((c,l)=>ce.jsx(d0,{position:c,index:l,isSelected:o===l,clampToGround:!0,isEditing:i,handleControlPointMouseEvent:s},l)),a.map(({points:c,showLine:l},u)=>ce.jsx(bFe,{a:c[0],b:c[1],color:i?B.fromCssColorString(h0):n,showLine:l},u))]})});FZ.displayName="SurfaceControlPoints";const AZ=R.memo(({geometryOptions:e,extrudedHeight:t,disableShadow:n,color:i,isEditing:r,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedControlPointIndex:c,catchedExtrudedPoint:l,selectedControlPointIndex:u,handleControlPointMouseEvent:h,handleAddControlPoint:d})=>{const f=R.useMemo(()=>e?{...e,controlPoints:e?.controlPoints.map(v=>new M.Cartesian3(...v))}:null,[e]),p=R.useMemo(()=>f?yN(f):null,[f]),{positionsArray:m,hierarchyArray:y}=R.useMemo(()=>p?.type==="Point"?{}:p?.type==="LineString"?{positionsArray:uF(p)}:p!=null?{positionsArray:uF(p),hierarchyArray:hF(p)}:{},[p]),g=R.useMemo(()=>B.fromCssColorString(i??hPe),[i]);return ce.jsxs(ce.Fragment,{children:[m?.map((v,S)=>ce.jsx(gFe,{dynamic:!0,positions:v,color:g,isEditing:r},S)),y?.map((v,S)=>ce.jsx(mFe,{dynamic:!0,hierarchy:v,color:g},S)),f!=null&&(!t||r)&&ce.jsx(FZ,{geometryOptions:f,color:g,isEditing:r,catchedControlPointIndex:c,selectedControlPointIndex:u,handleControlPointMouseEvent:h}),f!=null&&r&&ce.jsx(GZ,{geometryOptions:f,isEditing:r,handleAddControlPoint:d}),f!=null&&t&&ce.jsx(PZ,{geometryOptions:f,extrudedHeight:t,extrudedPoint:o,centroidBasePoint:s,centroidExtrudedPoint:a,catchedExtrudedPoint:l,color:g,isEditing:r,handleControlPointMouseEvent:h}),t&&y?.map((v,S)=>ce.jsx(pFe,{hierarchy:v,extrudedHeight:t,disableShadow:n,color:g,isEditing:r},S))]})});AZ.displayName="SketchComponent";const _Fe=({className:e,style:t,property:n,time:i,camera:r,small:o,ready:s,children:a,selectedLayerId:c,isLayerDraggable:l,isLayerDragging:u,shouldRender:h,layerSelectionReason:d,meta:f,customProvider:p,displayCredits:m,layersRef:y,featureFlags:g,requestingRenderMode:v,timelineManagerRef:S,cameraForceHorizontalRoll:T,onLayerSelect:C,onCameraChange:O,onLayerDrag:V,onLayerDrop:A,onLayerEdit:G,onLayerSelectWithRectStart:k,onLayerSelectWithRectMove:N,onLayerSelectWithRectEnd:P,onMount:w,onLayerVisibility:x,onLayerLoad:I,onCreditsUpdate:X},D)=>{const{cesium:Y,mouseEventHandles:H,cesiumIonAccessToken:J,context:z,layerSelectWithRectEventHandlers:W,sceneLight:Q,sceneBackgroundColor:q,sceneMsaaSamples:se,sceneMode:Ce,cameraViewBoundaries:_e,cameraViewOuterBoundaries:Ve,cameraViewBoundariesMaterial:Ae,handleCameraChange:fe,handleCameraMoveEnd:Xe,handleUpdate:nt,handleClick:it,handleMount:Z,handleUnmount:pe,handleTilesChange:he,handleTerrainProviderChange:$}=QLe({ref:D,property:n,time:i,selectedLayerId:c,selectionReason:d,meta:f,customProvider:p,layersRef:y,featureFlags:g,timelineManagerRef:S,isLayerDraggable:l,isLayerDragging:u,shouldRender:h,requestingRenderMode:v,camera:r,cameraForceHorizontalRoll:T,onLayerDrag:V,onLayerDrop:A,onLayerSelect:C,onLayerEdit:G,onLayerSelectWithRectStart:k,onLayerSelectWithRectMove:N,onLayerSelectWithRectEnd:P,onLayerVisibility:x,onLayerLoad:I,onCameraChange:O,onMount:w,onCreditsUpdate:X});return ce.jsxs(gre,{ref:Y,onUpdate:nt,className:e,requestRenderMode:!0,animation:!1,timeline:!1,baseLayer:!1,fullscreenButton:!1,homeButton:!1,geocoder:!1,infoBox:!1,baseLayerPicker:!1,navigationHelpButton:!1,projectionPicker:!1,sceneModePicker:!1,creditContainer:m?void 0:vFe,style:{width:o?"300px":"auto",height:o?"300px":"100%",display:s?void 0:"none",cursor:u?"grab":void 0,...t},shadows:!!n?.scene?.shadow?.enabled,onClick:it,onDoubleClick:H.doubleClick,onMouseDown:H.mouseDown,onMouseUp:H.mouseUp,onRightClick:H.rightClick,onRightDown:H.rightDown,onRightUp:H.rightUp,onMiddleClick:H.middleClick,onMiddleDown:H.middleDown,onMiddleUp:H.middleUp,onMouseMove:H.mouseMove,onMouseEnter:H.mouseEnter,onMouseLeave:H.mouseLeave,onWheel:H.wheel,automaticallyTrackDataSourceClocks:!1,children:[ce.jsx(zbe,{onMount:Z,onUnmount:pe}),ce.jsx(Zoe,{timelineManagerRef:S}),ce.jsx(Yye,{tiles:n?.tiles,cesiumIonAccessToken:J,customProvider:p,onTilesChange:he}),ce.jsx(mF,{tileLabels:n?.tileLabels}),ce.jsx(Kye,{property:n,timelineManagerRef:S}),ce.jsxs(kM,{useDefault:!0,children:[ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_CLICK}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOUBLE_CLICK})]}),ce.jsxs(kM,{children:[ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOWN,action:W.start.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_DOWN,modifier:M.KeyboardEventModifier.SHIFT,action:W.start.shift}),ce.jsx(hc,{type:M.ScreenSpaceEventType.MOUSE_MOVE,action:W.move.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.MOUSE_MOVE,modifier:M.KeyboardEventModifier.SHIFT,action:W.move.shift}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_UP,action:W.end.handler}),ce.jsx(hc,{type:M.ScreenSpaceEventType.LEFT_UP,modifier:M.KeyboardEventModifier.SHIFT,action:W.end.shift})]}),ce.jsx(ore,{maximumZoomDistance:n?.camera?.limiter?.enabled?n.camera?.limiter?.targetArea?.height??Number.POSITIVE_INFINITY:Number.POSITIVE_INFINITY,enableCollisionDetection:!n?.camera?.allowEnterGround}),ce.jsx(kne,{percentageChanged:.2,onChange:fe,onMoveEnd:Xe}),_e&&n?.camera?.limiter?.showHelper&&ce.jsx(uc,{children:ce.jsx(ml,{positions:_e,width:1,material:M.Color.RED,arcType:M.ArcType.RHUMB})}),Ve&&n?.camera?.limiter?.showHelper&&ce.jsx(uc,{children:ce.jsx(ml,{positions:Ve,width:1,material:Ae,arcType:M.ArcType.RHUMB})}),ce.jsx(ire,{backgroundColor:q,light:Q,mode:Ce,msaaSamples:se,useDepthPicking:!0,useWebVR:!!n?.scene?.vr||void 0,debugShowFramesPerSecond:!!n?.debug?.showFramesPerSecond,verticalExaggerationRelativeHeight:n?.scene?.verticalExaggerationRelativeHeight,verticalExaggeration:n?.scene?.verticalExaggeration}),ce.jsx(lre,{show:n?.sky?.skyBox?.show??!0}),ce.jsx(fie,{enabled:n?.sky?.fog?.enabled??!0,density:n?.sky?.fog?.density}),ce.jsx(hre,{show:n?.sky?.sun?.show??!0}),ce.jsx(kie,{show:n?.sky?.moon?.show??!0}),ce.jsx(are,{show:n?.sky?.skyAtmosphere?.show??!0,atmosphereLightIntensity:n?.sky?.skyAtmosphere?.lightIntensity,saturationShift:n?.sky?.skyAtmosphere?.saturationShift,brightnessShift:n?.sky?.skyAtmosphere?.brightnessShift}),ce.jsx(wse,{property:n,cesiumIonAccessToken:J,onTerrainProviderChange:$}),ce.jsx(EF.Provider,{value:z,children:s?a:null}),ce.jsx(lPe,{...uPe[n?.render?.ambientOcclusion?.quality||"low"],enabled:!!n?.render?.ambientOcclusion?.enabled,intensity:n?.render?.ambientOcclusion?.intensity??100,outputType:n?.render?.ambientOcclusion?.ambientOcclusionOnly?SN.Occlusion:null})]})},vFe=document.createElement("div"),zZ={cesium:{component:R.forwardRef(_Fe),featureComponent:G5e,clusterComponent:Xoe,sketchComponent:AZ,delegatedDataTypes:["czml","wms","mvt","3dtiles","osm-buildings","reearth-buildings","google-photorealistic","kml"]}};function wFe({error:e,resetErrorBoundary:t}){const i=e?.message??String(e);return ce.jsxs("div",{children:[ce.jsx("h1",{children:"Oops! An Error Occurred"}),ce.jsx("p",{children:i}),ce.jsx("p",{children:ce.jsx("button",{style:{color:"#fff"},onClick:t,children:"Retry"})})]})}const xFe="0.0.7-alpha.65",SFe=({viewerProperty:e})=>{const t=R.useRef(e);t.current=e;const n=R.useMemo(()=>({get version(){return xFe},get viewerProperty(){return t.current}}),[]);R.useEffect(()=>{window.reearth_core=n},[n])},EFe=768,TFe=({wrapperRef:e})=>{const t=R.useMemo(()=>CFe(new URLSearchParams(window.location.search)),[]),[n,i]=R.useState({width:void 0,height:void 0,isMobile:void 0,query:t});return R.useEffect(()=>{const r=new ResizeObserver(o=>{const[s]=o;let a,c;if(s.contentBoxSize){const l=Array.isArray(s.contentBoxSize)?s.contentBoxSize[0]:s.contentBoxSize;a=l.inlineSize,c=l.blockSize}else s.contentRect?(a=s.contentRect.width,c=s.contentRect.height):(a=e.current?.clientWidth,c=e.current?.clientHeight);i(l=>({width:a,height:c,isMobile:a?a<=EFe:void 0,query:l.query}))});return e.current&&r.observe(e.current),()=>{r.disconnect()}},[e]),n};function CFe(e){const t={};for(const[n,i]of e)t[n]=i;return t}function RFe({camera:e,interactionMode:t,zoomedLayerId:n,viewerProperty:i,onLayerSelect:r,onCameraChange:o,onInteractionModeChange:s,onZoomToLayer:a,onLayerDrop:c,onSketchTypeChangeProp:l},u){const h=R.useRef(null);R.useImperativeHandle(u,()=>h.current,[]);const d=R.useRef(null),f=TFe({wrapperRef:d}),[p,m]=R.useState({}),[y,g]=R.useState(),[v,S]=R.useState(),T=R.useCallback(async(Be,St,Dt,Et,$e)=>{const xt=p.layer?.layer?.type==="simple"&&p.layer?.layer?.data?.isSketchLayer;if(p.layerId===Be&&p.featureId===St&&!xt)return;const mn=await Dt?.(),kn=Be&&St?(xt?mn?.features?.find(Jn=>Jn.id===St):h.current?.engine.findComputedFeatureById?.(Be,St))??$e?.feature:void 0;g(Be&&St?h.current?.engine.findFeatureById?.(Be,St):void 0),S(kn),m(Jn=>Jn.layerId===Be&&Jn.featureId===St?Jn:{layerId:Be,featureId:St,layer:mn,reason:Et}),r?.(Be,Dt,kn,Et)},[p,r]),C=R.useRef(void 0),[O,V]=NZ(e,o),[A,G]=R.useState(!1),k=R.useCallback(Be=>{G(!!Be)},[]),[N,P]=NZ(t||"default",s);R.useEffect(()=>{N==="default"&&h?.current?.engine?.setCursor("auto")},[N]);const w=z0[N??"default"],x=R.useRef(void 0),I=R.useCallback(Be=>{x.current=Be},[]),X=R.useCallback(Be=>{x.current?.(Be)},[]),D=R.useRef(void 0),Y=R.useCallback(Be=>{D.current=Be},[]),H=R.useCallback(Be=>{D.current?.(Be)},[]),J=R.useRef(void 0),z=R.useCallback(Be=>{J.current=Be},[]),W=R.useCallback(Be=>{J.current?.(Be)},[]),Q=R.useRef(void 0),q=R.useCallback(Be=>{Q.current=Be},[]),se=R.useCallback(Be=>{Q.current?.(Be)},[]),Ce=R.useRef(void 0),_e=R.useCallback(Be=>{Ce.current=Be},[]),Ve=R.useCallback(Be=>{Ce.current?.(Be)},[]),Ae=R.useRef(void 0),fe=R.useCallback(Be=>{Ae.current=Be},[]),Xe=R.useCallback(Be=>{Ae.current?.(Be)},[]),nt=R.useRef([]),it=R.useCallback(Be=>{nt.current.push(Be)},[]),Z=R.useCallback(Be=>{nt.current.forEach(St=>St(Be))},[]),pe=R.useRef([]),he=R.useCallback(Be=>{pe.current.push(Be)},[]),$=R.useCallback(Be=>{pe.current.forEach(St=>St(Be))},[]),j=R.useRef([]),ee=R.useCallback(Be=>{j.current.push(Be)},[]),le=R.useCallback(Be=>{j.current.forEach(St=>St(Be))},[]),ge=R.useRef([]),te=R.useCallback(Be=>{ge.current.push(Be)},[]),ue=R.useCallback((Be,St)=>{ge.current.forEach(Dt=>Dt(Be)),l?.(Be,St)},[l]);R.useEffect(()=>{n&&(h.current?.engine?.lookAtLayer(n),a?.(void 0))},[n,a]);const[Re,ye]=R.useState(!1),Ue=R.useCallback(()=>{ye(!0)},[]),We=R.useCallback((Be,St,Dt)=>{ye(!1);const Et=h.current?.layers.findById(Be),$e=Et?.property.default.location?"default.location":Et?.property.default.position?"default.position":void 0;Dt&&Et&&Et.propertyId&&$e&&c?.(Et.propertyId,$e,Dt)},[c,h]),qe=R.useMemo(()=>({interactionMode:N,selectedLayer:p,selectedComputedFeature:v,viewport:f,handleCameraForceHorizontalRollChange:k,handleInteractionModeChange:P,onSketchPluginFeatureCreate:it,onSketchPluginFeatureUpdate:he,onSketchPluginFeatureDelete:ee,onSketchTypeChange:te,onLayerVisibility:Y,onLayerLoad:z,onLayerEdit:I,onLayerSelectWithRectStart:q,onLayerSelectWithRectMove:_e,onLayerSelectWithRectEnd:fe}),[N,p,v,f,P,k,I,it,he,ee,te,Y,z,q,_e,fe]),Xt=R.useMemo(()=>({position:"relative",width:"100%",height:"100%",overflow:"hidden"}),[]);return SFe({viewerProperty:i}),{mapRef:h,wrapperRef:d,selectedFeature:y,camera:O,featureFlags:w,isLayerDragging:Re,timelineManagerRef:C,cameraForceHorizontalRoll:A,coreContextValue:qe,containerStyle:Xt,overriddenInteractionMode:N,handleLayerSelect:T,handleLayerDrag:Ue,handleLayerDrop:We,handleLayerEdit:X,handleCameraChange:V,handleInteractionModeChange:P,handleSketchPluginFeatureCreate:Z,handleSketchPluginFeatureUpdate:$,handleSketchPluginFeatureDelete:le,handleSketchTypeChange:ue,handleLayerVisibility:H,handleLayerLoad:W,handleLayerSelectWithRectStart:se,handleLayerSelectWithRectMove:Ve,handleLayerSelectWithRectEnd:Xe}}function NZ(e,t){const[n,i]=R.useState(e),r=R.useCallback(o=>{o&&(i(o),t?.(o))},[t]);return R.useEffect(()=>{i(e)},[e]),[n,r]}const IFe=R.memo(R.forwardRef(({engine:e,isBuilt:t,isEditable:n,viewerProperty:i,layers:r,clusters:o,small:s,ready:a,hiddenLayers:c,camera:l,time:u,interactionMode:h,shouldRender:d,meta:f,customProvider:p,displayCredits:m=!0,style:y,zoomedLayerId:g,children:v,onLayerDrop:S,onLayerSelect:T,onCameraChange:C,onZoomToLayer:O,onInteractionModeChange:V,onMount:A,onSketchTypeChangeProp:G,onSketchFeatureCreate:k,onSketchFeatureUpdate:N,onSketchFeatureDelete:P,onAPIReady:w,onCreditsUpdate:x},I)=>{const{mapRef:X,wrapperRef:D,selectedFeature:Y,camera:H,featureFlags:J,isLayerDragging:z,timelineManagerRef:W,cameraForceHorizontalRoll:Q,coreContextValue:q,containerStyle:se,overriddenInteractionMode:Ce,handleLayerSelect:_e,handleLayerDrag:Ve,handleLayerDrop:Ae,handleLayerEdit:fe,handleCameraChange:Xe,handleInteractionModeChange:nt,handleSketchPluginFeatureCreate:it,handleSketchPluginFeatureUpdate:Z,handleSketchPluginFeatureDelete:pe,handleSketchTypeChange:he,handleLayerVisibility:$,handleLayerLoad:j,handleLayerSelectWithRectStart:ee,handleLayerSelectWithRectMove:le,handleLayerSelectWithRectEnd:ge}=RFe({camera:l,interactionMode:h,zoomedLayerId:g,viewerProperty:i,onLayerSelect:T,onCameraChange:C,onZoomToLayer:O,onLayerDrop:S,onInteractionModeChange:V,onSketchTypeChangeProp:G},I);return ce.jsx(Foe,{FallbackComponent:wFe,children:ce.jsx(koe,{mapRef:X,children:ce.jsxs("div",{ref:D,style:se,children:[ce.jsx(d5,{ref:X,isBuilt:t,isEditable:n,engine:e,layers:r,engines:zZ,camera:H,cameraForceHorizontalRoll:Q,clusters:o,hiddenLayers:c,isLayerDragging:z,isLayerDraggable:n,meta:f,customProvider:p,displayCredits:m,style:y,featureFlags:J,shouldRender:d,property:i,time:u,small:s,ready:a,timelineManagerRef:W,interactionMode:Ce,selectedFeature:Y,onCameraChange:Xe,onLayerDrag:Ve,onLayerDrop:Ae,onLayerSelect:_e,onLayerEdit:fe,overrideInteractionMode:nt,onSketchFeatureCreate:k,onSketchPluginFeatureCreate:it,onSketchFeatureUpdate:N,onSketchPluginFeatureUpdate:Z,onSketchFeatureDelete:P,onSketchPluginFeatureDelete:pe,onSketchTypeChange:he,onMount:A,onLayerVisibility:$,onLayerLoad:j,onLayerSelectWithRectStart:ee,onLayerSelectWithRectMove:le,onLayerSelectWithRectEnd:ge,onAPIReady:w,onCreditsUpdate:x}),ce.jsx(p5.Provider,{value:q,children:v})]})})})}));var cd=typeof global<"u"?global:typeof self<"u"?self:typeof window<"u"?window:{},ra=[],zo=[],MFe=typeof Uint8Array<"u"?Uint8Array:Array,GT=!1;function kZ(){GT=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,n=e.length;t<n;++t)ra[t]=e[t],zo[e.charCodeAt(t)]=t;zo[45]=62,zo[95]=63}function LFe(e){GT||kZ();var t,n,i,r,o,s,a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o=e[a-2]==="="?2:e[a-1]==="="?1:0,s=new MFe(a*3/4-o),i=o>0?a-4:a;var c=0;for(t=0,n=0;t<i;t+=4,n+=3)r=zo[e.charCodeAt(t)]<<18|zo[e.charCodeAt(t+1)]<<12|zo[e.charCodeAt(t+2)]<<6|zo[e.charCodeAt(t+3)],s[c++]=r>>16&255,s[c++]=r>>8&255,s[c++]=r&255;return o===2?(r=zo[e.charCodeAt(t)]<<2|zo[e.charCodeAt(t+1)]>>4,s[c++]=r&255):o===1&&(r=zo[e.charCodeAt(t)]<<10|zo[e.charCodeAt(t+1)]<<4|zo[e.charCodeAt(t+2)]>>2,s[c++]=r>>8&255,s[c++]=r&255),s}function PFe(e){return ra[e>>18&63]+ra[e>>12&63]+ra[e>>6&63]+ra[e&63]}function OFe(e,t,n){for(var i,r=[],o=t;o<n;o+=3)i=(e[o]<<16)+(e[o+1]<<8)+e[o+2],r.push(PFe(i));return r.join("")}function XZ(e){GT||kZ();for(var t,n=e.length,i=n%3,r="",o=[],s=16383,a=0,c=n-i;a<c;a+=s)o.push(OFe(e,a,a+s>c?c:a+s));return i===1?(t=e[n-1],r+=ra[t>>2],r+=ra[t<<4&63],r+="=="):i===2&&(t=(e[n-2]<<8)+e[n-1],r+=ra[t>>10],r+=ra[t>>4&63],r+=ra[t<<2&63],r+="="),o.push(r),o.join("")}function o1(e,t,n,i,r){var o,s,a=r*8-i-1,c=(1<<a)-1,l=c>>1,u=-7,h=n?r-1:0,d=n?-1:1,f=e[t+h];for(h+=d,o=f&(1<<-u)-1,f>>=-u,u+=a;u>0;o=o*256+e[t+h],h+=d,u-=8);for(s=o&(1<<-u)-1,o>>=-u,u+=i;u>0;s=s*256+e[t+h],h+=d,u-=8);if(o===0)o=1-l;else{if(o===c)return s?NaN:(f?-1:1)*(1/0);s=s+Math.pow(2,i),o=o-l}return(f?-1:1)*s*Math.pow(2,o-i)}function ZZ(e,t,n,i,r,o){var s,a,c,l=o*8-r-1,u=(1<<l)-1,h=u>>1,d=r===23?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:o-1,p=i?1:-1,m=t<0||t===0&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,s=u):(s=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-s))<1&&(s--,c*=2),s+h>=1?t+=d/c:t+=d*Math.pow(2,1-h),t*c>=2&&(s++,c/=2),s+h>=u?(a=0,s=u):s+h>=1?(a=(t*c-1)*Math.pow(2,r),s=s+h):(a=t*Math.pow(2,h-1)*Math.pow(2,r),s=0));r>=8;e[n+f]=a&255,f+=p,a/=256,r-=8);for(s=s<<r|a,l+=r;l>0;e[n+f]=s&255,f+=p,s/=256,l-=8);e[n+f-p]|=m*128}var GFe={}.toString,DZ=Array.isArray||function(e){return GFe.call(e)=="[object Array]"},VFe=50;ve.TYPED_ARRAY_SUPPORT=cd.TYPED_ARRAY_SUPPORT!==void 0?cd.TYPED_ARRAY_SUPPORT:!0,s1();function s1(){return ve.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Wa(e,t){if(s1()<t)throw new RangeError("Invalid typed array length");return ve.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t),e.__proto__=ve.prototype):(e===null&&(e=new ve(t)),e.length=t),e}function ve(e,t,n){if(!ve.TYPED_ARRAY_SUPPORT&&!(this instanceof ve))return new ve(e,t,n);if(typeof e=="number"){if(typeof t=="string")throw new Error("If encoding is specified then the first argument must be a string");return VT(this,e)}return UZ(this,e,t,n)}ve.poolSize=8192,ve._augment=function(e){return e.__proto__=ve.prototype,e};function UZ(e,t,n,i){if(typeof t=="number")throw new TypeError('"value" argument must not be a number');return typeof ArrayBuffer<"u"&&t instanceof ArrayBuffer?zFe(e,t,n,i):typeof t=="string"?AFe(e,t,n):NFe(e,t)}ve.from=function(e,t,n){return UZ(null,e,t,n)},ve.TYPED_ARRAY_SUPPORT&&(ve.prototype.__proto__=Uint8Array.prototype,ve.__proto__=Uint8Array,typeof Symbol<"u"&&Symbol.species&&ve[Symbol.species]);function WZ(e){if(typeof e!="number")throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function FFe(e,t,n,i){return WZ(t),t<=0?Wa(e,t):n!==void 0?typeof i=="string"?Wa(e,t).fill(n,i):Wa(e,t).fill(n):Wa(e,t)}ve.alloc=function(e,t,n){return FFe(null,e,t,n)};function VT(e,t){if(WZ(t),e=Wa(e,t<0?0:AT(t)|0),!ve.TYPED_ARRAY_SUPPORT)for(var n=0;n<t;++n)e[n]=0;return e}ve.allocUnsafe=function(e){return VT(null,e)},ve.allocUnsafeSlow=function(e){return VT(null,e)};function AFe(e,t,n){if((typeof n!="string"||n==="")&&(n="utf8"),!ve.isEncoding(n))throw new TypeError('"encoding" must be a valid string encoding');var i=BZ(t,n)|0;e=Wa(e,i);var r=e.write(t,n);return r!==i&&(e=e.slice(0,r)),e}function FT(e,t){var n=t.length<0?0:AT(t.length)|0;e=Wa(e,n);for(var i=0;i<n;i+=1)e[i]=t[i]&255;return e}function zFe(e,t,n,i){if(t.byteLength,n<0||t.byteLength<n)throw new RangeError("'offset' is out of bounds");if(t.byteLength<n+(i||0))throw new RangeError("'length' is out of bounds");return n===void 0&&i===void 0?t=new Uint8Array(t):i===void 0?t=new Uint8Array(t,n):t=new Uint8Array(t,n,i),ve.TYPED_ARRAY_SUPPORT?(e=t,e.__proto__=ve.prototype):e=FT(e,t),e}function NFe(e,t){if(oa(t)){var n=AT(t.length)|0;return e=Wa(e,n),e.length===0||t.copy(e,0,0,n),e}if(t){if(typeof ArrayBuffer<"u"&&t.buffer instanceof ArrayBuffer||"length"in t)return typeof t.length!="number"||i4e(t.length)?Wa(e,0):FT(e,t);if(t.type==="Buffer"&&DZ(t.data))return FT(e,t.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}function AT(e){if(e>=s1())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s1().toString(16)+" bytes");return e|0}ve.isBuffer=Wr;function oa(e){return!!(e!=null&&e._isBuffer)}ve.compare=function(t,n){if(!oa(t)||!oa(n))throw new TypeError("Arguments must be Buffers");if(t===n)return 0;for(var i=t.length,r=n.length,o=0,s=Math.min(i,r);o<s;++o)if(t[o]!==n[o]){i=t[o],r=n[o];break}return i<r?-1:r<i?1:0},ve.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},ve.concat=function(t,n){if(!DZ(t))throw new TypeError('"list" argument must be an Array of Buffers');if(t.length===0)return ve.alloc(0);var i;if(n===void 0)for(n=0,i=0;i<t.length;++i)n+=t[i].length;var r=ve.allocUnsafe(n),o=0;for(i=0;i<t.length;++i){var s=t[i];if(!oa(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(r,o),o+=s.length}return r};function BZ(e,t){if(oa(e))return e.length;if(typeof ArrayBuffer<"u"&&typeof ArrayBuffer.isView=="function"&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;typeof e!="string"&&(e=""+e);var n=e.length;if(n===0)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return l1(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return n*2;case"hex":return n>>>1;case"base64":return eD(e).length;default:if(i)return l1(e).length;t=(""+t).toLowerCase(),i=!0}}ve.byteLength=BZ;function kFe(e,t,n){var i=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((n===void 0||n>this.length)&&(n=this.length),n<=0)||(n>>>=0,t>>>=0,n<=t))return"";for(e||(e="utf8");;)switch(e){case"hex":return KFe(this,t,n);case"utf8":case"utf-8":return KZ(this,t,n);case"ascii":return HFe(this,t,n);case"latin1":case"binary":return jFe(this,t,n);case"base64":return BFe(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return JFe(this,t,n);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}ve.prototype._isBuffer=!0;function ru(e,t,n){var i=e[t];e[t]=e[n],e[n]=i}ve.prototype.swap16=function(){var t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var n=0;n<t;n+=2)ru(this,n,n+1);return this},ve.prototype.swap32=function(){var t=this.length;if(t%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var n=0;n<t;n+=4)ru(this,n,n+3),ru(this,n+1,n+2);return this},ve.prototype.swap64=function(){var t=this.length;if(t%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var n=0;n<t;n+=8)ru(this,n,n+7),ru(this,n+1,n+6),ru(this,n+2,n+5),ru(this,n+3,n+4);return this},ve.prototype.toString=function(){var t=this.length|0;return t===0?"":arguments.length===0?KZ(this,0,t):kFe.apply(this,arguments)},ve.prototype.equals=function(t){if(!oa(t))throw new TypeError("Argument must be a Buffer");return this===t?!0:ve.compare(this,t)===0},ve.prototype.inspect=function(){var t="",n=VFe;return this.length>0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),"<Buffer "+t+">"},ve.prototype.compare=function(t,n,i,r,o){if(!oa(t))throw new TypeError("Argument must be a Buffer");if(n===void 0&&(n=0),i===void 0&&(i=t?t.length:0),r===void 0&&(r=0),o===void 0&&(o=this.length),n<0||i>t.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&n>=i)return 0;if(r>=o)return-1;if(n>=i)return 1;if(n>>>=0,i>>>=0,r>>>=0,o>>>=0,this===t)return 0;for(var s=o-r,a=i-n,c=Math.min(s,a),l=this.slice(r,o),u=t.slice(n,i),h=0;h<c;++h)if(l[h]!==u[h]){s=l[h],a=u[h];break}return s<a?-1:a<s?1:0};function YZ(e,t,n,i,r){if(e.length===0)return-1;if(typeof n=="string"?(i=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=r?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(r)return-1;n=e.length-1}else if(n<0)if(r)n=0;else return-1;if(typeof t=="string"&&(t=ve.from(t,i)),oa(t))return t.length===0?-1:HZ(e,t,n,i,r);if(typeof t=="number")return t=t&255,ve.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?r?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):HZ(e,[t],n,i,r);throw new TypeError("val must be string, number or Buffer")}function HZ(e,t,n,i,r){var o=1,s=e.length,a=t.length;if(i!==void 0&&(i=String(i).toLowerCase(),i==="ucs2"||i==="ucs-2"||i==="utf16le"||i==="utf-16le")){if(e.length<2||t.length<2)return-1;o=2,s/=2,a/=2,n/=2}function c(f,p){return o===1?f[p]:f.readUInt16BE(p*o)}var l;if(r){var u=-1;for(l=n;l<s;l++)if(c(e,l)===c(t,u===-1?0:l-u)){if(u===-1&&(u=l),l-u+1===a)return u*o}else u!==-1&&(l-=l-u),u=-1}else for(n+a>s&&(n=s-a),l=n;l>=0;l--){for(var h=!0,d=0;d<a;d++)if(c(e,l+d)!==c(t,d)){h=!1;break}if(h)return l}return-1}ve.prototype.includes=function(t,n,i){return this.indexOf(t,n,i)!==-1},ve.prototype.indexOf=function(t,n,i){return YZ(this,t,n,i,!0)},ve.prototype.lastIndexOf=function(t,n,i){return YZ(this,t,n,i,!1)};function XFe(e,t,n,i){n=Number(n)||0;var r=e.length-n;i?(i=Number(i),i>r&&(i=r)):i=r;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var s=0;s<i;++s){var a=parseInt(t.substr(s*2,2),16);if(isNaN(a))return s;e[n+s]=a}return s}function ZFe(e,t,n,i){return u1(l1(t,e.length-n),e,n,i)}function jZ(e,t,n,i){return u1(t4e(t),e,n,i)}function DFe(e,t,n,i){return jZ(e,t,n,i)}function UFe(e,t,n,i){return u1(eD(t),e,n,i)}function WFe(e,t,n,i){return u1(n4e(t,e.length-n),e,n,i)}ve.prototype.write=function(t,n,i,r){if(n===void 0)r="utf8",i=this.length,n=0;else if(i===void 0&&typeof n=="string")r=n,i=this.length,n=0;else if(isFinite(n))n=n|0,isFinite(i)?(i=i|0,r===void 0&&(r="utf8")):(r=i,i=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var o=this.length-n;if((i===void 0||i>o)&&(i=o),t.length>0&&(i<0||n<0)||n>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var s=!1;;)switch(r){case"hex":return XFe(this,t,n,i);case"utf8":case"utf-8":return ZFe(this,t,n,i);case"ascii":return jZ(this,t,n,i);case"latin1":case"binary":return DFe(this,t,n,i);case"base64":return UFe(this,t,n,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return WFe(this,t,n,i);default:if(s)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),s=!0}},ve.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function BFe(e,t,n){return t===0&&n===e.length?XZ(e):XZ(e.slice(t,n))}function KZ(e,t,n){n=Math.min(e.length,n);for(var i=[],r=t;r<n;){var o=e[r],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r+a<=n){var c,l,u,h;switch(a){case 1:o<128&&(s=o);break;case 2:c=e[r+1],(c&192)===128&&(h=(o&31)<<6|c&63,h>127&&(s=h));break;case 3:c=e[r+1],l=e[r+2],(c&192)===128&&(l&192)===128&&(h=(o&15)<<12|(c&63)<<6|l&63,h>2047&&(h<55296||h>57343)&&(s=h));break;case 4:c=e[r+1],l=e[r+2],u=e[r+3],(c&192)===128&&(l&192)===128&&(u&192)===128&&(h=(o&15)<<18|(c&63)<<12|(l&63)<<6|u&63,h>65535&&h<1114112&&(s=h))}}s===null?(s=65533,a=1):s>65535&&(s-=65536,i.push(s>>>10&1023|55296),s=56320|s&1023),i.push(s),r+=a}return YFe(i)}var JZ=4096;function YFe(e){var t=e.length;if(t<=JZ)return String.fromCharCode.apply(String,e);for(var n="",i=0;i<t;)n+=String.fromCharCode.apply(String,e.slice(i,i+=JZ));return n}function HFe(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;r<n;++r)i+=String.fromCharCode(e[r]&127);return i}function jFe(e,t,n){var i="";n=Math.min(e.length,n);for(var r=t;r<n;++r)i+=String.fromCharCode(e[r]);return i}function KFe(e,t,n){var i=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>i)&&(n=i);for(var r="",o=t;o<n;++o)r+=e4e(e[o]);return r}function JFe(e,t,n){for(var i=e.slice(t,n),r="",o=0;o<i.length;o+=2)r+=String.fromCharCode(i[o]+i[o+1]*256);return r}ve.prototype.slice=function(t,n){var i=this.length;t=~~t,n=n===void 0?i:~~n,t<0?(t+=i,t<0&&(t=0)):t>i&&(t=i),n<0?(n+=i,n<0&&(n=0)):n>i&&(n=i),n<t&&(n=t);var r;if(ve.TYPED_ARRAY_SUPPORT)r=this.subarray(t,n),r.__proto__=ve.prototype;else{var o=n-t;r=new ve(o,void 0);for(var s=0;s<o;++s)r[s]=this[s+t]}return r};function Ri(e,t,n){if(e%1!==0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}ve.prototype.readUIntLE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t],o=1,s=0;++s<n&&(o*=256);)r+=this[t+s]*o;return r},ve.prototype.readUIntBE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t+--n],o=1;n>0&&(o*=256);)r+=this[t+--n]*o;return r},ve.prototype.readUInt8=function(t,n){return n||Ri(t,1,this.length),this[t]},ve.prototype.readUInt16LE=function(t,n){return n||Ri(t,2,this.length),this[t]|this[t+1]<<8},ve.prototype.readUInt16BE=function(t,n){return n||Ri(t,2,this.length),this[t]<<8|this[t+1]},ve.prototype.readUInt32LE=function(t,n){return n||Ri(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},ve.prototype.readUInt32BE=function(t,n){return n||Ri(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ve.prototype.readIntLE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=this[t],o=1,s=0;++s<n&&(o*=256);)r+=this[t+s]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*n)),r},ve.prototype.readIntBE=function(t,n,i){t=t|0,n=n|0,i||Ri(t,n,this.length);for(var r=n,o=1,s=this[t+--r];r>0&&(o*=256);)s+=this[t+--r]*o;return o*=128,s>=o&&(s-=Math.pow(2,8*n)),s},ve.prototype.readInt8=function(t,n){return n||Ri(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},ve.prototype.readInt16LE=function(t,n){n||Ri(t,2,this.length);var i=this[t]|this[t+1]<<8;return i&32768?i|4294901760:i},ve.prototype.readInt16BE=function(t,n){n||Ri(t,2,this.length);var i=this[t+1]|this[t]<<8;return i&32768?i|4294901760:i},ve.prototype.readInt32LE=function(t,n){return n||Ri(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ve.prototype.readInt32BE=function(t,n){return n||Ri(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ve.prototype.readFloatLE=function(t,n){return n||Ri(t,4,this.length),o1(this,t,!0,23,4)},ve.prototype.readFloatBE=function(t,n){return n||Ri(t,4,this.length),o1(this,t,!1,23,4)},ve.prototype.readDoubleLE=function(t,n){return n||Ri(t,8,this.length),o1(this,t,!0,52,8)},ve.prototype.readDoubleBE=function(t,n){return n||Ri(t,8,this.length),o1(this,t,!1,52,8)};function Ur(e,t,n,i,r,o){if(!oa(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||t<o)throw new RangeError('"value" argument is out of bounds');if(n+i>e.length)throw new RangeError("Index out of range")}ve.prototype.writeUIntLE=function(t,n,i,r){if(t=+t,n=n|0,i=i|0,!r){var o=Math.pow(2,8*i)-1;Ur(this,t,n,i,o,0)}var s=1,a=0;for(this[n]=t&255;++a<i&&(s*=256);)this[n+a]=t/s&255;return n+i},ve.prototype.writeUIntBE=function(t,n,i,r){if(t=+t,n=n|0,i=i|0,!r){var o=Math.pow(2,8*i)-1;Ur(this,t,n,i,o,0)}var s=i-1,a=1;for(this[n+s]=t&255;--s>=0&&(a*=256);)this[n+s]=t/a&255;return n+i},ve.prototype.writeUInt8=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,1,255,0),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[n]=t&255,n+1};function a1(e,t,n,i){t<0&&(t=65535+t+1);for(var r=0,o=Math.min(e.length-n,2);r<o;++r)e[n+r]=(t&255<<8*(i?r:1-r))>>>(i?r:1-r)*8}ve.prototype.writeUInt16LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8):a1(this,t,n,!0),n+2},ve.prototype.writeUInt16BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>8,this[n+1]=t&255):a1(this,t,n,!1),n+2};function c1(e,t,n,i){t<0&&(t=4294967295+t+1);for(var r=0,o=Math.min(e.length-n,4);r<o;++r)e[n+r]=t>>>(i?r:3-r)*8&255}ve.prototype.writeUInt32LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[n+3]=t>>>24,this[n+2]=t>>>16,this[n+1]=t>>>8,this[n]=t&255):c1(this,t,n,!0),n+4},ve.prototype.writeUInt32BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>24,this[n+1]=t>>>16,this[n+2]=t>>>8,this[n+3]=t&255):c1(this,t,n,!1),n+4},ve.prototype.writeIntLE=function(t,n,i,r){if(t=+t,n=n|0,!r){var o=Math.pow(2,8*i-1);Ur(this,t,n,i,o-1,-o)}var s=0,a=1,c=0;for(this[n]=t&255;++s<i&&(a*=256);)t<0&&c===0&&this[n+s-1]!==0&&(c=1),this[n+s]=(t/a>>0)-c&255;return n+i},ve.prototype.writeIntBE=function(t,n,i,r){if(t=+t,n=n|0,!r){var o=Math.pow(2,8*i-1);Ur(this,t,n,i,o-1,-o)}var s=i-1,a=1,c=0;for(this[n+s]=t&255;--s>=0&&(a*=256);)t<0&&c===0&&this[n+s+1]!==0&&(c=1),this[n+s]=(t/a>>0)-c&255;return n+i},ve.prototype.writeInt8=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,1,127,-128),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[n]=t&255,n+1},ve.prototype.writeInt16LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8):a1(this,t,n,!0),n+2},ve.prototype.writeInt16BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>8,this[n+1]=t&255):a1(this,t,n,!1),n+2},ve.prototype.writeInt32LE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,2147483647,-2147483648),ve.TYPED_ARRAY_SUPPORT?(this[n]=t&255,this[n+1]=t>>>8,this[n+2]=t>>>16,this[n+3]=t>>>24):c1(this,t,n,!0),n+4},ve.prototype.writeInt32BE=function(t,n,i){return t=+t,n=n|0,i||Ur(this,t,n,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ve.TYPED_ARRAY_SUPPORT?(this[n]=t>>>24,this[n+1]=t>>>16,this[n+2]=t>>>8,this[n+3]=t&255):c1(this,t,n,!1),n+4};function QZ(e,t,n,i,r,o){if(n+i>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function qZ(e,t,n,i,r){return r||QZ(e,t,n,4),ZZ(e,t,n,i,23,4),n+4}ve.prototype.writeFloatLE=function(t,n,i){return qZ(this,t,n,!0,i)},ve.prototype.writeFloatBE=function(t,n,i){return qZ(this,t,n,!1,i)};function $Z(e,t,n,i,r){return r||QZ(e,t,n,8),ZZ(e,t,n,i,52,8),n+8}ve.prototype.writeDoubleLE=function(t,n,i){return $Z(this,t,n,!0,i)},ve.prototype.writeDoubleBE=function(t,n,i){return $Z(this,t,n,!1,i)},ve.prototype.copy=function(t,n,i,r){if(i||(i=0),!r&&r!==0&&(r=this.length),n>=t.length&&(n=t.length),n||(n=0),r>0&&r<i&&(r=i),r===i||t.length===0||this.length===0)return 0;if(n<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),t.length-n<r-i&&(r=t.length-n+i);var o=r-i,s;if(this===t&&i<n&&n<r)for(s=o-1;s>=0;--s)t[s+n]=this[s+i];else if(o<1e3||!ve.TYPED_ARRAY_SUPPORT)for(s=0;s<o;++s)t[s+n]=this[s+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),n);return o},ve.prototype.fill=function(t,n,i,r){if(typeof t=="string"){if(typeof n=="string"?(r=n,n=0,i=this.length):typeof i=="string"&&(r=i,i=this.length),t.length===1){var o=t.charCodeAt(0);o<256&&(t=o)}if(r!==void 0&&typeof r!="string")throw new TypeError("encoding must be a string");if(typeof r=="string"&&!ve.isEncoding(r))throw new TypeError("Unknown encoding: "+r)}else typeof t=="number"&&(t=t&255);if(n<0||this.length<n||this.length<i)throw new RangeError("Out of range index");if(i<=n)return this;n=n>>>0,i=i===void 0?this.length:i>>>0,t||(t=0);var s;if(typeof t=="number")for(s=n;s<i;++s)this[s]=t;else{var a=oa(t)?t:l1(new ve(t,r).toString()),c=a.length;for(s=0;s<i-n;++s)this[s+n]=a[s%c]}return this};var QFe=/[^+\/0-9A-Za-z-_]/g;function qFe(e){if(e=$Fe(e).replace(QFe,""),e.length<2)return"";for(;e.length%4!==0;)e=e+"=";return e}function $Fe(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function e4e(e){return e<16?"0"+e.toString(16):e.toString(16)}function l1(e,t){t=t||1/0;for(var n,i=e.length,r=null,o=[],s=0;s<i;++s){if(n=e.charCodeAt(s),n>55295&&n<57344){if(!r){if(n>56319){(t-=3)>-1&&o.push(239,191,189);continue}else if(s+1===i){(t-=3)>-1&&o.push(239,191,189);continue}r=n;continue}if(n<56320){(t-=3)>-1&&o.push(239,191,189),r=n;continue}n=(r-55296<<10|n-56320)+65536}else r&&(t-=3)>-1&&o.push(239,191,189);if(r=null,n<128){if((t-=1)<0)break;o.push(n)}else if(n<2048){if((t-=2)<0)break;o.push(n>>6|192,n&63|128)}else if(n<65536){if((t-=3)<0)break;o.push(n>>12|224,n>>6&63|128,n&63|128)}else if(n<1114112){if((t-=4)<0)break;o.push(n>>18|240,n>>12&63|128,n>>6&63|128,n&63|128)}else throw new Error("Invalid code point")}return o}function t4e(e){for(var t=[],n=0;n<e.length;++n)t.push(e.charCodeAt(n)&255);return t}function n4e(e,t){for(var n,i,r,o=[],s=0;s<e.length&&!((t-=2)<0);++s)n=e.charCodeAt(s),i=n>>8,r=n%256,o.push(r),o.push(i);return o}function eD(e){return LFe(qFe(e))}function u1(e,t,n,i){for(var r=0;r<i&&!(r+n>=t.length||r>=e.length);++r)t[r+n]=e[r];return r}function i4e(e){return e!==e}function Wr(e){return e!=null&&(!!e._isBuffer||tD(e)||r4e(e))}function tD(e){return!!e.constructor&&typeof e.constructor.isBuffer=="function"&&e.constructor.isBuffer(e)}function r4e(e){return typeof e.readFloatLE=="function"&&typeof e.slice=="function"&&tD(e.slice(0,0))}var zT;function Kc(){}Kc.prototype=Object.create(null);function Bt(){Bt.init.call(this)}Bt.EventEmitter=Bt,Bt.usingDomains=!1,Bt.prototype.domain=void 0,Bt.prototype._events=void 0,Bt.prototype._maxListeners=void 0,Bt.defaultMaxListeners=10,Bt.init=function(){this.domain=null,Bt.usingDomains&&zT.active&&!(this instanceof zT.Domain)&&(this.domain=zT.active),(!this._events||this._events===Object.getPrototypeOf(this)._events)&&(this._events=new Kc,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},Bt.prototype.setMaxListeners=function(t){if(typeof t!="number"||t<0||isNaN(t))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=t,this};function nD(e){return e._maxListeners===void 0?Bt.defaultMaxListeners:e._maxListeners}Bt.prototype.getMaxListeners=function(){return nD(this)};function o4e(e,t,n){if(t)e.call(n);else for(var i=e.length,r=I0(e,i),o=0;o<i;++o)r[o].call(n)}function s4e(e,t,n,i){if(t)e.call(n,i);else for(var r=e.length,o=I0(e,r),s=0;s<r;++s)o[s].call(n,i)}function a4e(e,t,n,i,r){if(t)e.call(n,i,r);else for(var o=e.length,s=I0(e,o),a=0;a<o;++a)s[a].call(n,i,r)}function c4e(e,t,n,i,r,o){if(t)e.call(n,i,r,o);else for(var s=e.length,a=I0(e,s),c=0;c<s;++c)a[c].call(n,i,r,o)}function l4e(e,t,n,i){if(t)e.apply(n,i);else for(var r=e.length,o=I0(e,r),s=0;s<r;++s)o[s].apply(n,i)}Bt.prototype.emit=function(t){var n,i,r,o,s,a,c,l=t==="error";if(a=this._events,a)l=l&&a.error==null;else if(!l)return!1;if(c=this.domain,l){if(n=arguments[1],c)n||(n=new Error('Uncaught, unspecified "error" event')),n.domainEmitter=this,n.domain=c,n.domainThrown=!1,c.emit("error",n);else{if(n instanceof Error)throw n;var u=new Error('Uncaught, unspecified "error" event. ('+n+")");throw u.context=n,u}return!1}if(i=a[t],!i)return!1;var h=typeof i=="function";switch(r=arguments.length,r){case 1:o4e(i,h,this);break;case 2:s4e(i,h,this,arguments[1]);break;case 3:a4e(i,h,this,arguments[1],arguments[2]);break;case 4:c4e(i,h,this,arguments[1],arguments[2],arguments[3]);break;default:for(o=new Array(r-1),s=1;s<r;s++)o[s-1]=arguments[s];l4e(i,h,this,o)}return!0};function iD(e,t,n,i){var r,o,s;if(typeof n!="function")throw new TypeError('"listener" argument must be a function');if(o=e._events,o?(o.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),o=e._events),s=o[t]):(o=e._events=new Kc,e._eventsCount=0),!s)s=o[t]=n,++e._eventsCount;else if(typeof s=="function"?s=o[t]=i?[n,s]:[s,n]:i?s.unshift(n):s.push(n),!s.warned&&(r=nD(e),r&&r>0&&s.length>r)){s.warned=!0;var a=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");a.name="MaxListenersExceededWarning",a.emitter=e,a.type=t,a.count=s.length,u4e(a)}return e}function u4e(e){typeof console.warn=="function"?console.warn(e):console.log(e)}Bt.prototype.addListener=function(t,n){return iD(this,t,n,!1)},Bt.prototype.on=Bt.prototype.addListener,Bt.prototype.prependListener=function(t,n){return iD(this,t,n,!0)};function rD(e,t,n){var i=!1;function r(){e.removeListener(t,r),i||(i=!0,n.apply(e,arguments))}return r.listener=n,r}Bt.prototype.once=function(t,n){if(typeof n!="function")throw new TypeError('"listener" argument must be a function');return this.on(t,rD(this,t,n)),this},Bt.prototype.prependOnceListener=function(t,n){if(typeof n!="function")throw new TypeError('"listener" argument must be a function');return this.prependListener(t,rD(this,t,n)),this},Bt.prototype.removeListener=function(t,n){var i,r,o,s,a;if(typeof n!="function")throw new TypeError('"listener" argument must be a function');if(r=this._events,!r)return this;if(i=r[t],!i)return this;if(i===n||i.listener&&i.listener===n)--this._eventsCount===0?this._events=new Kc:(delete r[t],r.removeListener&&this.emit("removeListener",t,i.listener||n));else if(typeof i!="function"){for(o=-1,s=i.length;s-- >0;)if(i[s]===n||i[s].listener&&i[s].listener===n){a=i[s].listener,o=s;break}if(o<0)return this;if(i.length===1){if(i[0]=void 0,--this._eventsCount===0)return this._events=new Kc,this;delete r[t]}else h4e(i,o);r.removeListener&&this.emit("removeListener",t,a||n)}return this},Bt.prototype.removeAllListeners=function(t){var n,i;if(i=this._events,!i)return this;if(!i.removeListener)return arguments.length===0?(this._events=new Kc,this._eventsCount=0):i[t]&&(--this._eventsCount===0?this._events=new Kc:delete i[t]),this;if(arguments.length===0){for(var r=Object.keys(i),o=0,s;o<r.length;++o)s=r[o],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=new Kc,this._eventsCount=0,this}if(n=i[t],typeof n=="function")this.removeListener(t,n);else if(n)do this.removeListener(t,n[n.length-1]);while(n[0]);return this},Bt.prototype.listeners=function(t){var n,i,r=this._events;return r?(n=r[t],n?typeof n=="function"?i=[n.listener||n]:i=d4e(n):i=[]):i=[],i},Bt.listenerCount=function(e,t){return typeof e.listenerCount=="function"?e.listenerCount(t):oD.call(e,t)},Bt.prototype.listenerCount=oD;function oD(e){var t=this._events;if(t){var n=t[e];if(typeof n=="function")return 1;if(n)return n.length}return 0}Bt.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};function h4e(e,t){for(var n=t,i=n+1,r=e.length;i<r;n+=1,i+=1)e[n]=e[i];e.pop()}function I0(e,t){for(var n=new Array(t);t--;)n[t]=e[t];return n}function d4e(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}function sD(){throw new Error("setTimeout has not been defined")}function aD(){throw new Error("clearTimeout has not been defined")}var Jc=sD,Qc=aD;typeof cd.setTimeout=="function"&&(Jc=setTimeout),typeof cd.clearTimeout=="function"&&(Qc=clearTimeout);function cD(e){if(Jc===setTimeout)return setTimeout(e,0);if((Jc===sD||!Jc)&&setTimeout)return Jc=setTimeout,setTimeout(e,0);try{return Jc(e,0)}catch{try{return Jc.call(null,e,0)}catch{return Jc.call(this,e,0)}}}function f4e(e){if(Qc===clearTimeout)return clearTimeout(e);if((Qc===aD||!Qc)&&clearTimeout)return Qc=clearTimeout,clearTimeout(e);try{return Qc(e)}catch{try{return Qc.call(null,e)}catch{return Qc.call(this,e)}}}var Ba=[],ld=!1,ou,h1=-1;function p4e(){!ld||!ou||(ld=!1,ou.length?Ba=ou.concat(Ba):h1=-1,Ba.length&&lD())}function lD(){if(!ld){var e=cD(p4e);ld=!0;for(var t=Ba.length;t;){for(ou=Ba,Ba=[];++h1<t;)ou&&ou[h1].run();h1=-1,t=Ba.length}ou=null,ld=!1,f4e(e)}}function No(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];Ba.push(new uD(e,t)),Ba.length===1&&!ld&&cD(lD)}function uD(e,t){this.fun=e,this.array=t}uD.prototype.run=function(){this.fun.apply(null,this.array)};var m4e={},M0=cd.performance||{};M0.now||M0.mozNow||M0.msNow||M0.oNow||M0.webkitNow;var d1={env:m4e},NT;typeof Object.create=="function"?NT=function(t,n){t.super_=n,t.prototype=Object.create(n.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:NT=function(t,n){t.super_=n;var i=function(){};i.prototype=n.prototype,t.prototype=new i,t.prototype.constructor=t};var ud=NT,g4e=/%[sdj%]/g;function y4e(e){if(!UT(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(qc(arguments[n]));return t.join(" ")}for(var n=1,i=arguments,r=i.length,o=String(e).replace(g4e,function(a){if(a==="%%")return"%";if(n>=r)return a;switch(a){case"%s":return String(i[n++]);case"%d":return Number(i[n++]);case"%j":try{return JSON.stringify(i[n++])}catch{return"[Circular]"}default:return a}}),s=i[n];n<r;s=i[++n])DT(s)||!L0(s)?o+=" "+s:o+=" "+qc(s);return o}function hD(e,t){if($c(cd.process))return function(){return hD(e,t).apply(this,arguments)};if(d1.noDeprecation===!0)return e;var n=!1;function i(){if(!n){if(d1.throwDeprecation)throw new Error(t);d1.traceDeprecation?console.trace(t):console.error(t),n=!0}return e.apply(this,arguments)}return i}var f1={},kT;function b4e(e){if($c(kT)&&(kT=d1.env.NODE_DEBUG||""),e=e.toUpperCase(),!f1[e])if(new RegExp("\\b"+e+"\\b","i").test(kT)){var t=0;f1[e]=function(){var n=y4e.apply(null,arguments);console.error("%s %d: %s",e,t,n)}}else f1[e]=function(){};return f1[e]}function qc(e,t){var n={seen:[],stylize:v4e};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),dD(t)?n.showHidden=t:t&&R4e(n,t),$c(n.showHidden)&&(n.showHidden=!1),$c(n.depth)&&(n.depth=2),$c(n.colors)&&(n.colors=!1),$c(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=_4e),p1(n,e,n.depth)}qc.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},qc.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function _4e(e,t){var n=qc.styles[t];return n?"\x1B["+qc.colors[n][0]+"m"+e+"\x1B["+qc.colors[n][1]+"m":e}function v4e(e,t){return e}function w4e(e){var t={};return e.forEach(function(n,i){t[n]=!0}),t}function p1(e,t,n){if(e.customInspect&&t&&YT(t.inspect)&&t.inspect!==qc&&!(t.constructor&&t.constructor.prototype===t)){var i=t.inspect(n,e);return UT(i)||(i=p1(e,i,n)),i}var r=x4e(e,t);if(r)return r;var o=Object.keys(t),s=w4e(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),BT(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return XT(t);if(o.length===0){if(YT(t)){var a=t.name?": "+t.name:"";return e.stylize("[Function"+a+"]","special")}if(WT(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(fD(t))return e.stylize(Date.prototype.toString.call(t),"date");if(BT(t))return XT(t)}var c="",l=!1,u=["{","}"];if(T4e(t)&&(l=!0,u=["[","]"]),YT(t)){var h=t.name?": "+t.name:"";c=" [Function"+h+"]"}if(WT(t)&&(c=" "+RegExp.prototype.toString.call(t)),fD(t)&&(c=" "+Date.prototype.toUTCString.call(t)),BT(t)&&(c=" "+XT(t)),o.length===0&&(!l||t.length==0))return u[0]+c+u[1];if(n<0)return WT(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var d;return l?d=S4e(e,t,n,s,o):d=o.map(function(f){return ZT(e,t,n,s,f,l)}),e.seen.pop(),E4e(d,c,u)}function x4e(e,t){if($c(t))return e.stylize("undefined","undefined");if(UT(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}if(C4e(t))return e.stylize(""+t,"number");if(dD(t))return e.stylize(""+t,"boolean");if(DT(t))return e.stylize("null","null")}function XT(e){return"["+Error.prototype.toString.call(e)+"]"}function S4e(e,t,n,i,r){for(var o=[],s=0,a=t.length;s<a;++s)pD(t,String(s))?o.push(ZT(e,t,n,i,String(s),!0)):o.push("");return r.forEach(function(c){c.match(/^\d+$/)||o.push(ZT(e,t,n,i,c,!0))}),o}function ZT(e,t,n,i,r,o){var s,a,c;if(c=Object.getOwnPropertyDescriptor(t,r)||{value:t[r]},c.get?c.set?a=e.stylize("[Getter/Setter]","special"):a=e.stylize("[Getter]","special"):c.set&&(a=e.stylize("[Setter]","special")),pD(i,r)||(s="["+r+"]"),a||(e.seen.indexOf(c.value)<0?(DT(n)?a=p1(e,c.value,null):a=p1(e,c.value,n-1),a.indexOf(`
6732
6732
  `)>-1&&(o?a=a.split(`
6733
6733
  `).map(function(l){return" "+l}).join(`
6734
6734
  `).substr(2):a=`